【问题标题】:Logical error in MATLABMATLAB 中的逻辑错误
【发布时间】:2010-09-13 14:44:15
【问题描述】:
a4 = 10*magic(4);
a5 = magic(5);
a4
a5

diag4 = sub2ind([4,4], 1:3,1:3);
diag5 = sub2ind([5,5], 1:3,1:3);
a5(diag5) = a4(diag4)    #Display changed contents
diag4   %#  Display diagonal of magic4
diag5  %# Display diagonal of magic5

a4(diag4)=a5(diag5) %# Recovering the original

输出是

a4 =                     %# Display of original a4 magic square

   160    20    30   130
    50   110   100    80
    90    70    60   120
    40   140   150    10

a5 =               %#Display of original magic square
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

diag4 =
     1     6    11

diag5 =
     1     7    13

a5 =
   160    24     1     8    15
    23   110     7    14    16
     4     6    60    20    22
    10    12    19    21     3
    11    18    25     2     9

a4 =
   160    20    30   130
    50   110   100    80
    90    70    60   120
    40   140   150    10

diag4 和 diag5 的生成方式背后的逻辑是什么?

【问题讨论】:

  • x=A1(1:end,1:end,3);没有按照评论的建议获取对角线元素
  • 您到底想达到什么目的。不了解“目标”,您能否详细说明并举一个小例子?
  • @sumona:AB的尺寸是多少?
  • @second,我已经更新了问题。
  • @Jacob, size(A)=size(B)=256 256 3

标签: matlab image-processing


【解决方案1】:

我不太清楚你的目标,这里仍然是提取 RGB 图像对角线的一种方法(每个颜色通道的 2D 矩阵的对角线):

A = rand(32,32,3);   %# it can be any 3D matrix (and not necessarily square)
[r c d] = size(A);
diagIDX = bsxfun(@plus, 1:r+1:r*c, (0:d-1)'.*r*c);
A( diagIDX(:) )

diagIDX 将有三行,每行包含对角元素的(线性)索引(每个切片一个)。从那里您可以将其调整为您的代码...


上述代码背后的想法很简单:取一个二维矩阵,可以使用以下方法访问对角线元素:

A = rand(5,4);
[r c] = size(A);
A( 1:r+1:r*c )

然后在 3D 情况下,我添加了一个额外的偏移量,以相同的方式到达其他切片。

【讨论】:

  • 因此出现错误>>未定义的命令/函数'bsxfun'。此外,在沿 A(diagIDX(:)) 获取像素时,我如何用 A(diagIDX(:)) 的输出替换另一个图像的对角线元素,比如 B,并以大小 A 的图像形式显示 B。这是主要关注点和重新制定的问题。请解决这个问题。
  • @sumona:BSXFUN 函数是在 MATLAB R2007a 中引入的。如果您有旧版本,您仍然可以使用:diag2D = 1:r+1:r*c; diag3D = repmat(diag2D, [d 1]) + repmat((0:d-1)' .* r*c, [1 length(diag2D)]);。现在,如果我理解正确,您有两个相同大小的图像 A 和 B,那么您可以使用 A 的对角线替换 B 的对角线:B(diagIDX(:)) = A(diagIDX(:))。如果图像大小不同,则必须确保将索引限制为较小矩阵的索引以避免Index exceeds matrix dimensions 错误...
  • 感谢您的回复。您能否也从问题中发布的输出中解释 a4= 1 6 11 如何?因为这些是前三个对角线元素,而 1 6 11 未列为前三个元素。谢谢。
  • @sumona:在您的示例中,diag4 是索引向量而不是值本身(MATLAB 采用列优先顺序),要访问这些索引处的值,请使用 a4(diag4)
【解决方案2】:

访问矩阵的对角元素(获取或分配)的一种方法是使用sub2ind 查找条目:

>> a = magic(4);
>> ind = sub2ind([4,4], 1:3,1:3);
>> a(ind) = rand(1,3)

a =

    0.6551    2.0000    3.0000   13.0000
    5.0000    0.1626   10.0000    8.0000
    9.0000    7.0000    0.1190   12.0000
    4.0000   14.0000   15.0000    1.0000

第二个例子:

% Replace the first 3 items in the diagonal of a5 by 
% the first 3 items in the diagonal of a4.
>> a4 = 10*magic(4);
>> a5 = magic(5);
>> diag4 = sub2ind([4,4], 1:3,1:3);
>> diag5 = sub2ind([5,5], 1:3,1:3);
>> a5(diag5) = a4(diag4)

a5 =

   160    24     1     8    15
    23   110     7    14    16
     4     6    60    20    22
    10    12    19    21     3
    11    18    25     2     9

【讨论】:

  • @second。好的,所以我们可以使用 3D 矩阵代替使用 rand 填充数组 a,在我的情况下是图像 B 吗?如果是这样,那么图像括号中的条目是什么。另外,我真的需要使用排序功能,使整个过程可逆/可逆。还有另一个命令眼,可以检索对角线。如果我错了,请纠正我。谢谢。
  • eye 创建一个单位矩阵。你可以使用 sub2ind 两次,一次提取对角线条目,如果你想对它们运行一些操作,然后分配给输出的对角线
  • @second。该代码适用于不同大小的矢量。但是在具有相似大小的矩阵的情况下,变量 diag4 和 diag5 如何知道它们包含哪些对角线元素。比如 size(a4)=size(a5)=5 5 。然后 diag4=diag5!!不应该这样。请澄清。
  • @second,关于获取对角线的方式,我有一个重要的问题。如果你愿意通过这个链接stackoverflow.com/questions/3689840/… 已经回答。在答案中,提到了一种获取相邻对角线像素的方法。那么,这是另一种获取像素的方法吗?
  • diag 只是对应于对角线的指标列表。这取决于大小,但不取决于矩阵条目。提取我们索引到实际矩阵中的条目:diag = indecies, a5(diag) = entries
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2020-09-08
  • 1970-01-01
相关资源
最近更新 更多