簡體   English   中英

消除矩陣中的零-Matlab

[英]Eliminating zeros in a matrix - Matlab

嗨,我有以下矩陣:

A = 1 2 3; 0 4 0; 1 0 9

我希望矩陣A為:

A = 1 2 3; 1 4 9

PS-分號代表每列的結尾,新列開始。

如何在Matlab 2014a中做到這一點? 有什么幫助嗎?

謝謝

您的問題陳述遇到的問題是您不提前知道“壓縮”矩陣的形狀,尤其是您不知道非零元素的數量是否是任一行的倍數的事實或原始矩陣的列。

如前所述,有一個簡單的函數nonzeros ,它返回輸入的非零元素,按列排序。 就你而言

A = [1 2 3;
     0 4 0;
     1 0 9];
B = nonzeros(A)

產生

1
1
2
4
3
9

你想要的是

1 2 3
1 4 9

當您按列“擠出”零時,碰巧就是得到的結果。 這可以通過以下方式獲得(當每列中的零數相同時)

reshape(B, 2, 3);

我認為最好假設每列中的元素數量不相同-然后您需要創建一個稀疏數組。 這實際上很容易:

S = sparse(A);

生成的對象S是稀疏數組-也就是說,它僅包含非零元素。 當許多元素為零時,這非常有效(用於存儲和計算):一旦超過1/3的元素為非零,它很快就會變慢/變大。 但這具有保持矩陣形狀的優點,而與零的分布無關。

一個更強大的解決方案將必須檢查每列中非零元素的數量,並確定最終矩陣的形狀是:

cc = sum(A~=0);

將計算矩陣每一列中非零元素的數量。

nmin = min(cc);
nmax = max(cc);

查找任何列中最小和最大數量的非零元素

[i j s] = find(A); % the i, j coordinates and value of nonzero elements of A
nc = size(A, 2); % number of columns

B = zeros(nmax, nc);
for k = 1:nc
  B(1:cc(k), k) = s(j == k);
end

現在, B具有所有非零元素:對於具有較少非零元素的列,末尾將填充零。 最后,您可以決定是否/要修剪矩陣B多少個-如果您根本不想要零,則需要修剪較長列中的一些值。 例如:

B = B(1:nmin, :); 

簡單的解決方案:

A = [1 2 3;0 4 0;1 0 9]

A =

     1     2     3
     0     4     0
     1     0     9

A(A==0) = [];

A =

     1     1     2     4     3     9

reshape(A,2,3)

ans =

     1     2     3
     1     4     9

這很簡單,但可能會很慢。 您是否需要在非常大/很多矩陣上執行此操作?

從您的問題中不清楚您想要什么(如何排列非零值,特別是如果每​​列中的零數不相同的話)。 也許這樣:

A = reshape(nonzeros(A),[],size(A,2));

Matlab的邏輯索引功能非常強大。 最好的方法是創建邏輯數組:

>> lZeros = A==0

然后使用此邏輯數組索引到A並刪除這些零

>> A(lZeros) = []

最后,使用內置的reshape命令將數組調整為所需的大小

>> A = reshape(A, 2, 3)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM