如何使用;6“;Scilab上重载插入函数中的字符代码?

如何使用;6“;Scilab上重载插入函数中的字符代码?,scilab,Scilab,在Scilab 6.0.2的帮助文档中,我可以阅读关于重载项的以下说明,关于此项表中显示的最后一个操作代码“iext”: “6字符代码可用于某些复杂的插入算法,如x.b(2)=33,其中b字段未在结构x中定义。插入自动分解为temp=x.b;temp(2)=33;x.b=temp。6字符代码用于此算法的第一步。6重载函数与e的函数非常相似。” 但是我找不到一个完整的例子来说明如何使用这个“char6代码”来重载函数。我正在尝试使用它,但没有成功。有没有人有这样做的例子?下面的代码创建了一个普通的

在Scilab 6.0.2的帮助文档中,我可以阅读关于重载项的以下说明,关于此项表中显示的最后一个操作代码“iext”:

“6字符代码可用于某些复杂的插入算法,如x.b(2)=33,其中b字段未在结构x中定义。插入自动分解为temp=x.b;temp(2)=33;x.b=temp。6字符代码用于此算法的第一步。6重载函数与e的函数非常相似。”
但是我找不到一个完整的例子来说明如何使用这个“char6代码”来重载函数。我正在尝试使用它,但没有成功。有没有人有这样做的例子?

下面的代码创建了一个普通的“mlist”作为例子。哪个需要重载函数

A = rand(5,3)
names = ["colA" "colB" "colC"]
units = ["ft"   "in"     "lb"]
M = mlist(["Mlog" "names" "units" names],names,units,A(:,1),A(:,2),A(:,3))
以下是过载功能:

//define display
function %Mlog_p(M)
    n = size(M.names,"*")
    formatStr = strcat(repmat("%10s   ",1,n)) + "\n"
    formatNum = strcat(repmat("%0.10f   ",1,n)) + "\n"
    mprintf(formatStr,M.names)
    mprintf(formatStr,M.units)
    disp([M(M.names(1)),M(M.names(2)),M(M.names(3))])
end

//define extraction operation
function [Mat]=%Mlog_e(varargin)
    M    = varargin($)
    cols = [1:size(M.names,"*")] // This will also work
    cols = cols(varargin($-1))   // when varargin($-1) = 1:1:$
    Mat = []
    if length(varargin)==3 then
        for i = M.names(cols)
            Mat = [Mat M(i)(varargin(1))]
        end     
    else
        for i=1:size(M.names(cols),"*")
            Mat(i).name = M.names(cols(i))
            Mat(i).unit = M.units(cols(i))
            Mat(i).data  = M(:,cols(i))
        end
    end
endfunction

//define insertion operations (a regular matrix into a Mlog matrix)
function ML=%s_i_Mlog(i,j,V,M)
    names = M.names
    units = M.units
    A = M(:,:) // uses function above 
    A(i,j) = V
    ML = mlist(["Mlog" "names" "units" names],names,units,A(:,1),A(:,2),A(:,3))
endfunction

//insertion operation with structures (the subject of the question)
function temp = %Mlog_6(j,M)
    temp = M(j) // uses function %Mlog_e
endfunction

function M = %st_i_Mlog(j,st,M)
    A = M(:,:) // uses function %Mlog_e
    M.names(j) = st.name // uses function above
    M.units(j) = st.unit // uses function above
    A(:,j)     = st.data // uses function above  
    names = M.names
    units = M.units    
    M = mlist(["Mlog" "names" "units" names],names,units,A(:,1),A(:,2),A(:,3))
endfunction
第一个重载(显示mlist)将以下表的形式显示矩阵:

--> M
 M  = 

      colA         colB         colC   
        ft           in           lb   

   0.4720517   0.6719395   0.5628382
   0.0623731   0.1360619   0.5531093
   0.0854401   0.2119744   0.0768984
   0.0134564   0.4015942   0.5360758
   0.3543002   0.4036219   0.0900212
接下来的重载(提取和插入)将允许以简单矩阵的形式访问表
M(i,j)

提取功能还将允许列访问M,该列返回一个结构,例如:

--> M(2)
 ans  =

   name: "colB"
   unit: "in"
   data: [5x1 constant]
最后两个函数是问题中提到的重载。它们允许以结构形式更改列元数据

--> M(2).name = "length"
 M  = 

      colA       length         colC   
        ft           in           lb   

   0.4720517   0.6719395   0.5628382
   0.0623731   0.1360619   0.5531093
   0.0854401   0.2119744   0.0768984
   0.0134564   0.4015942   0.5360758
   0.3543002   0.4036219   0.0900212

为什么需要这种复杂的重载?您的用户定义数据类型是什么?我试图用数字数据制作一个表格,我想为每一列添加一些可以通过插入结构类型来更改的“元数据”,例如:
Matrix(j)。type=“year”
其中
j
是列的编号,
type
是结构字段的名称,
“year”
是“column metadata”的值。该矩阵也可以通过常规符号
矩阵(i,j)
访问。我想我知道如何执行此操作,并将发布答案。干得好。继续做好工作。在此帮助其他Scilab用户。有很多。