2015-09-06 125 views
2

如何删除矩阵中不是全部位于一条直线中的元素,而是不通过for循环中的某一行?从矩阵的每一行中删除一个元素,每个元素都在不同的列中

实施例:

[1 7 3 4; 
1 4 4 6; 
2 7 8 9] 

给定一个向量(例如,[2,4,3])如何可以删除的元素的每一行(其中,向量中的每个数字对应于列编号)不经去通过每一行,并删除每个元素?

示例输出将是:

[1 3 4; 
1 4 4; 
2 7 9] 

回答

1

它可以使用在linear indexing如下进行。请注意,这是更好地工作下来列(因为Matlab的column-major顺序),这意味着在开始和结束时换位:

A = [ 1 7 3 4 
     1 4 4 6 
     2 7 8 9 ]; 
v = [2 4 3]; %// the number of elements of v must equal the number of rows of A 
B = A.'; %'// transpose to work down columns 
[m, n] = size(B); 
ind = v + (0:n-1)*m; %// linear index of elements to be removed 
B(ind) = []; %// remove those elements. Returns a vector 
B = reshape(B, m-1, []).'; %'// reshape that vector into a matrix, and transpose back 
+0

谢谢!你能得到这个工作的3D矩阵(元素中的所有图层被删除?)。或者,3D矩阵的线性索引太笨重了? – llll0

+0

我认为这是可以做到的。但我不确定你想要什么。由于这似乎是一个重大的改变,所以我建议你发一个新的问题。一定要包括一个例子 –

0

下面是使用bsxfunpermute解决了3D阵列情况下的一种方法,假设要在所有的3D片除去每行的索引元素 -

%// Inputs 
A = randi(9,3,4,3) 
idx = [2 4 3] 

%// Get size of input array, A 
[M,N,P] = size(A) 

%// Permute A to bring the columns as the first dimension 
Ap = permute(A,[2 1 3]) 

%// Per 3D slice offset linear indices 
offset = bsxfun(@plus,[0:M-1]'*N,[0:P-1]*M*N) %//' 

%// Get 3D array linear indices and remove those from permuted array 
Ap(bsxfun(@plus,idx(:),offset)) = [] 

%// Permute back to get the desired output 
out = permute(reshape(Ap,3,3,3),[2 1 3]) 

采样运行 -

>> A 
A(:,:,1) = 
    4  4  1  4 
    2  9  7  5 
    5  9  3  9 
A(:,:,2) = 
    4  7  7  2 
    9  6  6  9 
    3  5  2  2 
A(:,:,3) = 
    1  7  5  8 
    6  2  9  6 
    8  4  2  4 
>> out 
out(:,:,1) = 
    4  1  4 
    2  9  7 
    5  9  9 
out(:,:,2) = 
    4  7  2 
    9  6  6 
    3  5  2 
out(:,:,3) = 
    1  5  8 
    6  2  9 
    8  4  4 
相关问题