有没有简单的方法可以将第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
答案 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
获取单个索引以进行访问进入你的矩阵。这将是列主要格式。然后您可以使用它并将所有值设置为零。这是一个例子。在我们执行此操作之前,我们需要首先了解矩阵的width
和height
:
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{:})