【问题标题】:"Logical Indexing with a Smaller Array" in matlab [duplicate]matlab中的“具有较小数组的逻辑索引”[重复]
【发布时间】:2015-12-02 23:38:38
【问题描述】:

matrix indexing 的 matlab 帮助页面说:

使用更小的数组进行逻辑索引

在大多数情况下,逻辑索引数组应该有相同的编号 元素作为被索引到的数组,但这不是 要求。索引数组可能更小(但不是更大) 尺寸:

A = [1 2 3;4 5 6;7 8 9]
A =
     1     2     3
     4     5     6
     7     8     9

B = logical([0 1 0; 1 0 1])
B =
     0     1     0
     1     0     1

isequal(numel(A), numel(B))
ans =
     0

A(B)
ans =
     4
     7
     8

matlab 在这里使用了什么样的疯狂规则?

【问题讨论】:

  • 我不明白你的实际问题是什么?你具体有哪些不明白的代码?
  • 在您提供的引用之后有一种解释:“MATLAB 将索引数组的缺失元素视为存在并设置为零”。我说“有点”是因为他们忽略了 Matlab 在句子后面的示例中切换到线性索引的事实:C = logical([B(:);0;0;0]);isequal(A(C),A(B)) == true
  • 您可以将其视为 Matlab 正在应用 隐式findA(find(B))。 (我并不是说 Matlab 在内部这样做;但在功能上它是等价的)。隐含的find 处理了两个可能令人惊讶的问题:它线性化了索引数组B,并选择了true 条目的整数索引(使得缺少一些false 条目并不重要)跨度>
  • 对,我没有意识到它正在线性化数组。多么明智的行为……

标签: arrays matlab


【解决方案1】:

要了解这种行为,有必要了解矩阵是如何存储在内存中的。 Matlab 使用列主要布局存储矩阵。这意味着二维矩阵:

                       A =   1     2     3
                             4     5     6
                             7     8     9

作为一维数组存储在内存中,沿着 A 的列向下:

A     = { array  = [1  4  7  2  5  8  3  6  9]  
          n_rows = 3
          n_cols = 3                            }

矩阵 B:

                        B =  0     1     0
                             1     0     1

在内存中存储为:

B     = { array  = [0  1  1  0  0  1]  
          n_rows = 2
          n_cols = 3                            }

让我们将底层表示并排放置:

A.array = [1  4  7  2  5  8  3  6  9] 
B.array = [0  1  1  0  0  1]  

使用逻辑索引,A(B) 给你[4, 7, 8] 如果你想得更深入一点,导致不直观结果的原因是:(1)Matlab 使用列主布局和(2)列数A 和 B 不同。

注意:我在这里使用伪代码。 A.array 不是有效代码等...

奖金: 您可以看到调用 reshape 命令时会发生什么。底层数据数组没有改变,只是与数据数组关联的 n_rows 和 n_cols。

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 2020-02-06
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多