如何使用 MatLAB 脚本从表中构建数组?

Posted

技术标签:

【中文标题】如何使用 MatLAB 脚本从表中构建数组?【英文标题】:How to build an array from a table using MatLAB script? 【发布时间】:2018-04-05 05:00:13 【问题描述】:

我正在尝试使用 MatLAB 从 m*n 数据表中选择特定数组。错误消息:索引超出矩阵维度

检查下面的 MatLAB 脚本:

    t_res = 0.2;
    c_angle = 360/30;
    iact = 0.1;
    V = 12;
    p = 1;
    
    for p=1:length(p),
    for p=1:5,
        Time = p*t_res;
        Angle = Time*c_angle/2;
        if (p == 1)
            delt_i = 0; 
        else
            delt_i = 0.5* t_res* V /L_obt;
        end
     iact = iact+delt_i;
    
     [~, ~, raw] = xlsread('F:\User\Matlab\data1.xlsx','Sheet3','A2:D11');
     data = reshape([raw:],size(raw)); 
     Current = data(:,1);
     Angle1 = data(:,2);
     Torque = data(:,3);
     Fluxlinkage = data(:,4);
     
    
     F = scatteredInterpolant(Current,Angle1,Fluxlinkage);
     Fluxlinkage = F(iact,Angle);
     L_obt = Fluxlinkage/iact; 
     F = scatteredInterpolant(Current,Angle1,Torque);
     Torque = F(iact,Angle);
    
    
    Table = [p' Time' Angle' iact' delt_i' abs(Torque)' Fluxlinkage' L_obt'];
    fprintf('%d\t\t %f\t\t %f\t\t %f\t\t %f\t\t %f\t\t %f\t\t %f\n', Table');
    
    end
    p=p+1;
    Table(3,5);
    end

收到错误消息:尝试访问 Table(3,5);索引超出范围,因为 size(Table)=[1,8]

【问题讨论】:

请查看How to create a Minimal, Complete, and Verifiable example。你至少应该说出错误发生在哪里。 你不应该使用p作为两个循环嵌套时的循环变量......而且你不需要p=p+1,因为for循环的要点是没有手册增量!看起来你应该只删除外部 for 循环。除此之外,不要在每个循环中读取相同的 Excel 数据,只需在循环外执行即可!没有上下文,这段代码真的毫无意义,并且可以通过上下文得到很大的改进...... 我已经删除了外部循环以及 p=p+1。仍然与“尝试访问 Table(3,5); index out of bounds because size(Table)=[1,8].”相同的错误。 @Wolfie 请投票给这个问题,这可以帮助我提出问题,因为它对我来说被阻止了。 【参考方案1】:

这是您的代码的重组版本。我将不需要在循环中的东西移出它。并对你真正想做的事情做了一些假设。有关更改的说明,请参见下面的 cmets。注意:我无法对此进行测试,因为我没有您的电子表格,但它至少应该让您更接近。

t_res = 0.2;
c_angle = 360/30;
iact = 0.1;
V = 12;
%p = 1;  %This does nothing since your iterate over p in the loop

%These things don't depend n "p" so don't put them in the loop
[~, ~, raw] = xlsread('F:\Pradeep\Matlab\data1.xlsx','Sheet3','A2:D11');
data = reshape([raw:],size(raw));
Current = data(:,1);
Angle1 = data(:,2);
Torque = data(:,3);
Fluxlinkage = data(:,4);
F1 = scatteredInterpolant(Current,Angle1,Fluxlinkage);
F2 = scatteredInterpolant(Current,Angle1,Torque);

%I assume you want to build your var "Table" in the loop ... not to be
%confused with an actaul Matlab type "table" ... so pre-allocate
Table = zeros(5,8);

for p=1:5,
    Time = p*t_res;
    Angle = Time*c_angle/2;
    if (p == 1)
        delt_i = 0;
    else
        delt_i = 0.5* t_res* V /L_obt;   
    end
    iact = iact+delt_i;

    Fluxlinkage = F1(iact,Angle);
    L_obt = Fluxlinkage/iact;
    Torque = F2(iact,Angle);    

    %You were just overwritning the same row again and again ... so create
    %a new row for each results.
    Table(p,:) = [p Time Angle iact delt_i abs(Torque) Fluxlinkage L_obt];
    %Print the new row.
    fprintf('%d\t\t %f\t\t %f\t\t %f\t\t %f\t\t %f\t\t %f\t\t %f\n', Table(p,:));

end
%Not sure what this is for ... since the output is surpressed by the
%semi-colon ???
Table(3,5);

【讨论】:

我正在尝试选择一个数组,例如如果我应该为第 3 行和第 4 列选择生成的表值,它会自动给出特定值。试图从同一个生成的表中绘制任何 3 个变量。 就像我在代码 cmets 中所说的那样,您在循环的每次迭代中都会覆盖表中的同一行。现在它应该正确构建您的Table 矩阵。如果您想查看第 3 行第 4 列中的内容,则可以使用 value = Table(3,4)。但是,您在Table(3,5); 上方的方式会将特定值放入默认的ans var 中,但会抑制输出到命令提示符......所以基本上它什么都不做。 例如,如果您想绘制角度与时间的关系,您可以这样做:plot(Table(:,2),Table(:,3)) 但前提是您像我的示例中那样修复代码以实际构建表而不覆盖它。 我正在尝试绘制时间、角度、扭矩之间的曲面。 如何使用上面的脚本制作表面?【参考方案2】:

首先,在第 11 行你说:

delt_i = 0.5* t_res* V /L_obt;

L_obt 似乎没有定义。

那么,第 38 行的指令有问题:

Table(3,5);

由于Table 是一维数组(一行8 个值),因此您只需要一个介于1 和8 之间的数字,例如Table(3)Table(5)。在二维数组的情况下,Table(3,5) 表示您需要第 3 行第 5 列中的值。

【讨论】:

第三行第五列的值。 没错@PradeeptaSahu。这是否回答了您最初的问题?在这种情况下随意投票和接受:-) @ alpereira7 请投票给我的问题,以便我可以提问。现在我的帐户被禁止了。

以上是关于如何使用 MatLAB 脚本从表中构建数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 从表中的二维数组输出值

如何从表中删除分区?

PL/SQL:如何从表中选择数据并输入到包接受数组类型?

从表中删除行(无法读取null的属性'data')

如何从表中提取上下文数据来训练自定义命名实体识别器?

在PostgreSQL中,如何根据分类列中每个级别的比例从表中随机抽样?