你可以在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;
答案 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
无法找到不等于的任何值-1
,find
会返回一个空数组,表明它无法找到{{1}中的任何位置}}不等于t1
。这可能不是你想要做的。
您的评论指出在执行代码之前,-1
循环之外的t1
被设置。虽然情况可能如此,但是在for
循环的第一次迭代后,您正在更改t1
,这将不可避免地给您带来的错误。
因此,您可能需要更正此声明 - 通过删除它或修改它以使其成为您正在寻找的定义。
如果你for
你的代码,那么你可以弄明白正在发生什么,这确实很有帮助。因此,MATLAB有一些很好的工具可以帮助您调试代码,这样您就可以找出它无法正常工作的原因。如果您愿意,您需要将MATLAB设置为调试模式。如果这是你想要的,在MATLAB编辑器中,转到你看到debug
语句的行,然后单击行号旁边的水平短划线。你会看到一个红点,表示当该函数运行时,该函数将在此时暂停。
在t2 = find(t1 ~= -1);
模式下,您可以看到代码的当前执行状态。您还可以检查变量的外观,以及在此之后逐行逐步执行此操作可以看到每条线在做什么。您可以在调试模式下键入debug
以转到下一行,也可以通过单击步骤按钮在MATLAB编辑器中执行此操作。您还可以选择不同的按钮:
有关MATLAB调试的更多信息,请在此处查看这个伟大的MathWorks链接:http://www.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html#brqxeeu-178