在matlab中,赋值比非单例下标错误具有更多非单例rhs维度

时间:2014-09-17 16:03:59

标签: matlab

你可以在MATLAB中看到我的部分代码。当我运行它时,我收到此错误: 赋值具有比非单例更多的非单例rhs维度 标。 请帮我纠正并了解原因。 tnx很多。

while Time < t_stop

for i4 = 1:x
for j4 = 1:y
for k4 = 1:z

% t1 has been defined in another place and updates in every cycle
t2 = find(t1 ~= -1); %t2 is not empty because t1 has non-(-1) elements
t3 = zeros(1,numel(t2));
for i5 = 1:numel(t2)
t3(i5) = t1(t2(i5));
end;
var1 = min(t3(:));
min_time(i4,j4,k4) = var1;
if numel(find(t1 == var1)) == 1
    min_IND (i4,j4,k4) = find(t1 == var1);
else
    Temp_find = find(t1 == var1);
    min_IND (i4,j4,k4) = Temp_find(randi(numel(find(t1 == var1))));
end;

t1 = zeros(1,41)-1;
end;
end;
end;

Time=Time+1;

end;

1 个答案:

答案 0 :(得分:1)

为什么会发生错误?

这是因为您的t2 = find(t1 ~= -1)语句返回一个空数组。这意味着您的t1数组没有任何不等于-1的条目。当您开始深入研究代码时,t3 = zeros(1,numel(t2))将创建一个空矩阵,因为t2中的元素数量为0,因为之前的find调用。

接下来,当你谈到这个陈述时:

for i5 = 1:numel(t2)
    t3(i5) = t1(t2(i5));
end

for循环不会执行,因为t2中的元素数等于0.当您在以下语句之后转到此语句时:

var1 = min(t3(:));

var1也会给你一个空矩阵。最后,当你谈到这个陈述时:

min_time(i4,j4,k4) = var1;

您正尝试将值分配到min_time中的某个位置。具体来说,您尝试将一个值分配给min_time中应该存储在var1中的位置,但由于它是空的,这就是您收到此错误的原因。因此,您需要仔细检查t2变量,以确保在继续执行代码之前这不是空的。


那么错误发生在哪里?

我可以看到为什么您收到此错误,以及发生这种情况的地方。如果你看看你的代码的结尾,你有这样的陈述:

t1 = zeros(1,41)-1;

您正在做的是t1以使条目全部 -1。当您返回循环的下一次迭代时,t2 = find(t1 ~= -1)语句将返回一个空数组,因为t1所有值等于-1。由于find无法找到不等于的任何值-1find会返回一个空数组,表明它无法找到{{1}中的任何位置}}不等于t1。这可能不是你想要做的。

您的评论指出在执行代码之前,-1循环之外的t1被设置。虽然情况可能如此,但是在for循环的第一次迭代后,您正在更改t1,这将不可避免地给您带来的错误。

因此,您可能需要更正此声明 - 通过删除它或修改它以使其成为您正在寻找的定义。


一些提示

如果你for你的代码,那么你可以弄明白正在发生什么,这确实很有帮助。因此,MATLAB有一些很好的工具可以帮助您调试代码,这样您就可以找出它无法正常工作的原因。如果您愿意,您需要将MATLAB设置为调试模式。如果这是你想要的,在MATLAB编辑器中,转到你看到debug语句的行,然后单击行号旁边的水平短划线。你会看到一个红点,表示当该函数运行时,该函数将在此时暂停。

t2 = find(t1 ~= -1);模式下,您可以看到代码的当前执行状态。您还可以检查变量的外观,以及在此之后逐行逐步执行此操作可以看到每条线在做什么。您可以在调试模式下键入debug以转到下一行,也可以通过单击步骤按钮在MATLAB编辑器中执行此操作。您还可以选择不同的按钮:

  • 继续 - 继续运行代码,直至到达下一个断点或退出该功能
  • 步骤 - 运行下一行代码
  • 单步执行 - 运行下一行代码。如果这一行是函数,那么你将进入函数内部并能够调试其中的语句。如果您只是执行步骤,它会运行该功能,但不会进入。因此,这会在下一行暂停之前运行整个函数。
  • Step Out - 如果您在函数内部,执行此操作将运行代码,直到函数离开。然后,代码将在您离开该功能之后暂停,然后从那里继续。

有关MATLAB调试的更多信息,请在此处查看这个伟大的MathWorks链接:http://www.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html#brqxeeu-178