【问题标题】:Matlab - indexingMatlab - 索引
【发布时间】:2015-10-20 11:51:08
【问题描述】:

我有一个矩阵A,它是 21x1,只包含一个和两个。 然后我有一个矩阵B,它是 6 * 600 的矩阵,由 0 到 21 之间的数字组成。

我想生成一个矩阵 C,它是 6 * 600 的矩阵,包含一个和两个这样:

如果B 矩阵有一个零,矩阵C 应该在那个地方有一个零。如果 B 矩阵的编号为 5,则矩阵 C 的元素应该位于矩阵 A 的第 5 行,以此类推。

如果不清楚,请告诉我。

【问题讨论】:

  • 不清楚。你说矩阵 A 只有一个和两个,然后你说:如果 A 矩阵有一个零?自从你说它只有一个和两个之后就没有了。
  • 刚刚在您发表评论前 30 秒进行了编辑。抱歉打错字了。希望现在很清楚。
  • 很高兴知道为什么这被否决了。

标签: matlab indexing


【解决方案1】:

让我们生成一些样本输入:

A = randi(2,21,1);
B = randi(22,6,600)-1;

C 的输出将是:

C = B*0;              %// preallocation + take care of the elements that need to be 0
C(B>0) = A(B(B>0));   %// logical indexing

第2行的解释如下:

右轴

  • B>0 - 返回一个大小为B 的逻辑数组,其含义是B 的这个特定元素是否大于0。
  • B(B>0) - 返回 B 的元素,在 B>0 中有 true 值(即可用于索引到 A 的数字)。
  • A(...) - 返回 A 中与来自 B 的有效索引相对应的元素。

【讨论】:

  • @volcompt - 不客气!请注意,除了用文字解释问题之外,最好提供示例输入/输出示例 - 这样可以让其他人轻松(可能?)测试他们的解决方案。
【解决方案2】:
% Generate matrices fitting the description
A = round(rand(21,1))+1;
B = round(rand(6,600)*21);
C = zeros(6,600);

% Indexing impossible since zeroes cannot be used as index. So treat per element using linear indexing.

for ii = 1:(6*600)
   if B(ii) == 0
      C(ii) = 0;
   else
      C(ii) = A(B(ii));
   end
end

虽然这段代码可以进一步优化,但这是最清晰的理解方式,如果只是对这个小矩阵进行有限次数的评估,则不需要速度。

【讨论】:

  • A2=[0;A]; 然后C=A2(B+1); 怎么样
  • 如果要显式迭代矩阵的所有元素,最好使用numel()
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 2018-03-20
  • 2013-01-01
  • 2013-06-30
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多