【问题标题】:Assignment has more non-singleton rhs dimensions than non-singleton subscripts error in matlab赋值比matlab中的非单一下标错误具有更多的非单一rhs维度
【发布时间】:2014-09-17 16:03:59
【问题描述】:

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

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;

【问题讨论】:

  • 哪里出错了?你能在错误之前显示 whos 的输出吗?
  • 你好。它出现在这一行:“ min_time(i4,j4,k4) = var1; "
  • 好的。如果你把它放在这一行之前,'whos' 会输出什么?您将看到 var1 和 min_time 的大小,它们可能不一样,从而引发错误。

标签: matlab


【解决方案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;

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


那么错误发生在哪里?

我可以看到为什么您会收到此错误,以及发生此错误的位置。如果您查看代码的末尾,您会看到以下语句:

t1 = zeros(1,41)-1;

你正在做的是你正在制作t1,这样条目是all -1。当您返回循环的下一次迭代时,t2 = find(t1 ~= -1) 语句将返回一个空数组,因为t1所有 值等于-1。因为find 找不到任何不等于-1 的值,find 返回一个空数组,说明它在t1 中找不到任何不等于@ 的位置987654348@。这可能不是你打算做的。

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

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


给你的一些提示

如果你debug你的代码真的很有帮助,这样你就可以弄清楚发生了什么。因此,MATLAB 有一些很棒的工具可以帮助您调试代码,这样您就可以找出它不工作的原因。如果您想这样做,您需要将 MATLAB 设置为调试模式。如果这是您想要的,在您的 MATLAB 编辑器中,转到您看到 t2 = find(t1 ~= -1); 语句的行,然后单击行号旁边的水平破折号。您会看到一个红点,表示当函数运行时,函数将在此时暂停。

debug 模式下,您可以看到代码的当前执行状态。您还可以检查变量的样子,以及在此点之后逐行执行,以便查看每条线在做什么。您可以在调试模式下输入dbstep 以转到下一行,也可以在 MATLAB 编辑器中通过单击 Step 按钮执行此操作。您还可以选择不同的按钮:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多