【问题标题】:Get even/odd indices of a matrix - MATLAB获取矩阵的偶数/奇数索引 - MATLAB
【发布时间】:2014-12-22 18:44:42
【问题描述】:

我有以下问题:

我有一个给定的矩阵,比如说4x4。 如何获得以下组合的索引:

  • 行奇数列奇数
  • 奇数行偶数列
  • 偶数行奇数列
  • 行偶数列偶数

例如,如果我有矩阵:

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
  • “奇数行和奇数列”将是 1、3、9、11...的索引...
  • '行奇数列偶数'将是 2、4、10、12...的索引...
  • “偶数行和奇数列”将是 5、7、13、15...的索引...
  • 而“行偶数和列偶数”将是 6、8、14、16...的索引...

此外,是否可以将这些操作组合起来,例如我得到了“奇数行和奇数列”和“偶数行和偶数列”的索引?

谢谢!

【问题讨论】:

  • 如果您的矩阵被称为A,那么您可以获得奇数行和偶数列,如下所示:A(1:2:end, 2:2:end)。从那里开始剩下的应该很容易(基本上只是从1开始奇数和2偶数

标签: matlab matrix indexing indices


【解决方案1】:

索引很容易做到:

奇数行奇数列

B = A(1:2:end, 1:2:end);

奇数行偶数列

B = A(1:2:end, 2:2:end);

偶数行奇数列

B = A(2:2:end, 1:2:end);

偶数行偶数列

B = A(2:2:end, 2:2:end);

以上假设您需要实际的矩阵值本身。这有点令人困惑,因为您的矩阵元素与线性索引值本身相同。如果要确定访问矩阵的实际列主索引,可以从1 to N 生成一个向量,其中N 是矩阵中元素的总数,然后将此矩阵重塑为所需的大小。之后,使用上面相同的逻辑来获得实际的线性索引:

N = numel(A);
B = reshape(1:N, size(A,1), size(A,2));
ind = B(1:2:end, 1:2:end); %// For odd rows, odd columns
%// Repeat for the other ones...

现在,根据您的评论,您希望创建一个新矩阵,该矩阵将仅存储这些提取的矩阵值,同时使所有其他元素为零。如果你想这样做,只需预先分配一个零矩阵,然后复制这些值以使用计算出的索引提取到新矩阵中。换句话说:

N = numel(A);
B = reshape(1:N, size(A,1), size(A,2));
ind = B(1:2:end, 1:2:end); %// For odd rows, odd columns - Change to suit your tastes
out = zeros(size(A));
out(ind(:)) = A(ind(:));

如果您想组合索引,例如奇数行 - 奇数列,偶数行 - 偶数列,只需计算两组索引,将它们连接成一个向量并像以前一样执行相同的语法。因此:

N = numel(A);
B = reshape(1:N, size(A,1), size(A,2));
ind = B(1:2:end, 1:2:end); %// For odd rows, odd columns
ind2 = B(2:2:end, 2:2:end); %// For even rows, even columns
ind = [ind(:); ind2(:)];
out = zeros(size(A));
out(ind) = A(ind);

【讨论】:

  • 实际上我想做以下事情:给定一个矩阵,我想提取这些值,取决于偶数/奇数行/列到另一个相同的矩阵!大小并用零填充所有未复制的索引。例如,如果我有矩阵 (1 2, 3 4) 并且我想要奇数/奇数和偶数/偶数矩阵将填充 (0 2, 3 0) 我希望这是一个更好的解释
  • @DrSkyer 在为 new_matrix 预分配后执行 new_matrix(ind(:)) = A(ind(:))。 BTW +1,我一开始搞砸了:)
  • @Divakar - 感谢 +1 :) 我承认看到你使用 bsxfun 大声笑我有点困惑。
  • 谢谢你们,完成了这项工作!
  • @Divakar - 嗯......这是真的,是的。我可以推荐的一种替代方法是使用sub2ind,并定义一个符合OP想要的坐标ndgrid。这样,您就不会浪费(尽可能多的)空间。
【解决方案2】:

代码

N = size(A,1); %// Get size of input matrix A

case1_ind = bsxfun(@plus,[1:2:N]',(0:N/2-1)*2*N)
case2_ind = case1_ind + N
case3_ind = case1_ind + 1
case4_ind = case3_ind + N

注意:这些输出是索引。因此,要获得实际输出,请将它们用作索引。

要组合 case 1case 4 的索引,只需连接 -

case14comb_ind = [case1_ind ; case4_ind]

编辑:

%// To copy onto some other matrix of the same size as A, do this for case 1
new_matrix = zeros(size(A))
new_matrix(case1_ind(:)) = A(case1_ind(:))

对其他情况也重复此操作。

【讨论】:

  • 我想对你的两个答案都投赞成票,但我没有 15 的声誉 xD 抱歉!还是谢谢你!
  • @DrSkyer Comeon 不要撒谎! ;) 开个玩笑,你现在可以做 :)
  • @Divakar - 很好,我会支持你的答案:P。反正我也想,但是忘记了!
猜你喜欢
  • 2013-05-13
  • 1970-01-01
  • 2015-05-29
  • 2018-03-26
  • 2016-10-02
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多