【问题标题】:MATLAB matrix replacement assignment gives errorMATLAB 矩阵替换赋值给出错误
【发布时间】:2010-03-07 19:39:40
【问题描述】:

我尝试更新矩阵的某些部分,我收到以下错误消息:

???赋值的非单例右轴维度比非单例下标少

我的代码尝试更新表示二进制图像的矩阵的一些值。我的代码如下:

outImage(3:5,2:4,1) = max(imBinary(3:5,2:4,1));

当我删除最后一个参数 (1) 时,这次我得到了同样的错误。我想尺寸之间存在不匹配,但我无法理解。 outImage 是当时创建的一个新对象(我之前尝试创建它,但没有任何改变)。可能有什么问题?

【问题讨论】:

  • 我已经编辑了我所做的。我在二进制图像中四处走动,并使用结构化元素对其进行 OR 操作。这次在语法上看起来不错,但它不起作用。你对 MATLAB 的 strel 函数有什么想法吗?我不能将 strel 对象直接用作矩阵,MATLAB 会生气。我尝试了 strel 对象的 getnhood 函数,但对输出图像完全没有影响。我错过了一些关于 strel 对象的东西吗?

标签: matlab matrix variable-assignment dimension


【解决方案1】:

您在另一个答案中的一个 cmets 中提到您正在尝试创建自己的膨胀算法,因此希望在 3×3×1 子矩阵中取最大值并替换其中的值具有最大值的子矩阵。默认情况下,函数MAX 将沿子矩阵的列运行,这将为您提供一个 1×3 矩阵(即 3×3×1 矩阵的列的最大值)。错误是因为 MATLAB 无法将 1×3 矩阵分配给 3×3×1 矩阵。

一种解决方案是在 1×3 矩阵上再次调用 MAX 以获得标量值,然后您可以将其分配给 3×3×1 子矩阵的每个元素而不会出错:

outImage(3:5,2:4,1) = max(max(imBinary(3:5,2:4,1)));

【讨论】:

  • 没错。顺便说一句,如果你以后想在 3D 中这样做,我会先将子图像读入一个临时变量,然后执行 max(tmp(:))。因此,您不必担心维度。
【解决方案2】:

在方程的 rhs 上,取 3x3x1 子矩阵的最大值,该子矩阵返回 1x3 向量。然后,您尝试将其分配给 3x3x1 子矩阵。单例下标是值为 1 的一个。所以 rhs 有 1 个非单例下标,而 lhs 有 2 个。Matlab 无法弄清楚如何扩展 1x3 矩阵以填充 3x3x1 空间。

我不完全确定你想做什么,所以我不会猜测解决方案。您是否要制作 3 个 rhs 副本并将其放入 lhs 子矩阵的每一行?或者你想在 rhs 上构造一个 3x3x1 矩阵?

【讨论】:

  • 我正在尝试编写自己的膨胀方法。作为热身,我尝试取矩阵的 3x3 部分并将该部分中的最大值分配给该部分中的全部值。谢谢你,你的解释真的很有帮助。我对 MATLAB 很陌生,我对基础知识感到困惑。我无法想到最大操作会给我一个 1x3 矩阵。我认为它会返回一个值,但同样,它不会有任何好处。我应该考虑一下,再次感谢。
【解决方案3】:

是否要为 rhs 表达式的每一列按最大值填充 outImage 中的所有索引元素?您可以使用 REPMAT 扩展您在 rhs 上获得的行:

outImage(3:5,2:4,1) = repmat(max(imBinary(3:5,2:4,1)),3,1)

outImage(3:5,2:4) 也可以。

【讨论】:

  • 谢谢,但这不是我想要的。将图像转换为二进制后,我放弃了使用最大操作(如果我处理灰度图像,这是必要的)。我现在使用逻辑或运算。无论如何,谢谢。
【解决方案4】:

我之前也遇到过同样的错误,之前我所做的是定义了左手矩阵。我不知道你是否有同样的情况,但你可以尝试以下方法:

outImage=Zeros(M,N,K);

M、N 和 K 是您拥有的尺寸。然后只需输入:

outImage(3:5,2:4,1) = max(max(imBinary(3:5,2:4,1)));

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 2012-10-19
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多