如何使用 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 脚本从表中构建数组?的主要内容,如果未能解决你的问题,请参考以下文章