将每列中的指定行数和元素块设置为零

时间:2014-05-21 16:11:22

标签: matlab for-loop matrix

有没有简单的方法可以将第n列中指定数量的行k设置为零?解释这个问题有点棘手,所以我想最好看看这个例子。 让我们说:

A =

 1     2     3
 4     5     6
 7     8     9
10    11    12
13    14    15
16    17    18

我希望设置行,如下所示:[row1 col1] = 0; [row2 col1] = 0,然后是[row3 col2]= 0; row4 col2]= 0,依此类推,所以我的输出是:

k = 2
B =

 0     2     3
 0     5     6
 7     0     9
10     0    12
13    14     0
16    17     0

您是否有任何建议/解决方案如何通过for循环解决这个问题,或者可能还有其他方法?

以及如何将此解决方案进一步扩展到以下内容:      A =

  1     2     3     1    2     3
  4     5     6     4    5     6
  7     8     9     7    8     9
 10    11    12    10    11    12
 13    14    15    13    14    15
 16    17    18    16    17    18

B =

 0     0     3     1    2     3
 0     0     6     4    5     6
 7     8     0     0    8     9
10    11     0     0    3     1
13    14    15    13    0     0
16    17    18    16    0     0

4 个答案:

答案 0 :(得分:3)

一种方法 -

k = 2;

row1 = 1:size(A,1)
col1 = ceil([1:size(A,1)]./k)
A(sub2ind(size(A),row1,col1))=0

对于已修改的问题,请像这样使用kron -

k = 2;

a1 = eye(size(A)./k);
b1 = ones(k,k);
A(logical(kron(a1,b1)))=0

答案 1 :(得分:2)

这不是问题。我们可以根据此值0确定完全要设置为k的行和列,然后使用sub2ind获取单个索引以进行访问进入你的矩阵。这将是列主要格式。然后您可以使用它并将所有值设置为零。这是一个例子。在我们执行此操作之前,我们需要首先了解矩阵的widthheight

rows = [row1 row2 row3];
cols = [col1 col2 col3];

%// Get column major indices
ind = sub2ind([height width], rows, cols);

%// Set the values in this matrix to 0.
B(ind) = 0;

现在以您的示例为例,我们需要访问所有行。但是,对于列,我们需要访问每列中的k元素并确保它们不重叠。因此,我们可以这样做:

k = 2;
B = reshape(1:18, 6, 3).';
rows = 1 : 6;
cols = ceil(rows / k);
ind = sub2ind([rows cols], rows, cols);
B(ind) = 0;

你会得到:

B =

 0     2     3
 0     5     6
 7     0     9
10     0    12
13    14     0
16    17     0

答案 2 :(得分:0)

以下代码可在matlab中执行,并按您的要求执行:

% Create A-matrix
A = reshape(1:18,6,3)
% Set specified datapoints to zero
A([1,2],[1,1]) = 0

或者,您可以单独设置每个元素

A(1,1) = 0
A(1,2) = 0

最通用的方式, k n

A([1:k],n) = 0

答案 3 :(得分:0)

对于第一个问题:

A(mod(0:numel(A)-1, size(A,1)+k) < k) = 0;

对于第二个问题,包括第一个问题作为一个特例:

c = repmat({ones(k,size(B,2)/size(B,1)*k)}, size(B,1)/k, 1);
B = B.*~blkdiag(c{:})