Gunther已經走上了正軌。你要選擇一個元素,如果
- 非零的行cumsum爲1 和
- 非零的列cumsum爲1 和
- 元素本身是非零。
下面的代碼解決了這個問題:然而
A = [0, 0, 3, 4;
4, 3, 2, 0;
2, 0, 2, 0];
batches = cell(0);
while any(A(:)~=0)
selector = cumsum(A~=0, 1) .* cumsum(A~=0, 2) .* (A~=0) == 1;
batches{end+1} = A .* selector;
A(selector) = 0;
end
注意,由於它的第二批是
0 0 0 4
0 3 0 0
2 0 0 0
這意味着返回的解決方案不是最佳的剩餘矩陣元素是從同一列:
0 0 0 0
0 0 2 0
0 0 2 0
不幸的是,你不能在同一批次中繪製它們。所以你最終得到四批而不是三批。
編輯:也許,這是一個好主意,首先選擇這些元素,這些元素出現在具有很多非零的行/列中。例如,可以使用這些權重
weight = repmat(sum(A~=0, 1), size(A, 1), 1) ...
.* repmat(sum(A~=0, 2), 1, size(A, 2)) .* (A~=0)
weight =
0 0 6 2
6 3 9 0
4 0 6 0
下面的算法
batches = cell(0);
while any(A(:)~=0)
batch = zeros(size(A));
weight = repmat(sum(A~=0, 1), size(A, 1), 1) ...
.* repmat(sum(A~=0, 2), 1, size(A, 2)) .* (A~=0);
while any(weight(:)~=0)
[r,c] = find(weight == max(weight(:)), 1);
batch(r,c) = A(r,c);
A(r,c) = 0;
weight(r,:) = 0;
weight(:,c) = 0;
end
batches{end+1} = batch;
end
返回這些批次。
batches{:}
ans =
0 0 0 4
0 0 2 0
2 0 0 0
ans =
0 0 3 0
4 0 0 0
0 0 0 0
ans =
0 0 0 0
0 3 0 0
0 0 2 0
所以它至少在這個小測試案例中起作用。
現在好了,那個循環看起來非常熟悉...... :) –
@Rody:是的。對你的算法結構和我的權重感謝;-) – Mehrwolf
順便說一句,我認爲總結repmats而不是乘以它們可能會更好。 – Mehrwolf