假設我有以下矩陣: 一個=替換第一(x個)非楠與楠
2 NaN NaN
4 NaN 3
3 7 9
5 12 5
8 10 8
12 5 10
我需要與楠每一列來替換第x個非楠值。
如果要替換值的數目爲x = 3,則新的矩陣應該是:
B =
NaN NaN NaN
NaN NaN NaN
NaN NaN NaN
5 NaN NaN
8 NaN 8
12 5 10
任何想法如何做到這一點?
在此先感謝。
假設我有以下矩陣: 一個=替換第一(x個)非楠與楠
2 NaN NaN
4 NaN 3
3 7 9
5 12 5
8 10 8
12 5 10
我需要與楠每一列來替換第x個非楠值。
如果要替換值的數目爲x = 3,則新的矩陣應該是:
B =
NaN NaN NaN
NaN NaN NaN
NaN NaN NaN
5 NaN NaN
8 NaN 8
12 5 10
任何想法如何做到這一點?
在此先感謝。
這裏是另一個量化代碼:
%# given the data
a = [ 2 NaN NaN; 4 NaN 3; 3 7 9; 5 12 5; 8 10 8; 12 5 10 ]
x = 3
%# replace with NaNs
sz = size(a);
d = [ones(1,sz(2)) ; diff(~isnan(a))];
rIdx = arrayfun(@(k) find(d(:,k),1,'last'), 1:sz(2));
ind = bsxfun(@plus, sub2ind(sz, rIdx, 1:sz(2)), (0:x-1)');
a(ind(:)) = NaN;
首先,我們檢查非楠元素,那麼我們diff
橫跨行的結果。我們在每列中找到最後一個1
的位置,轉換爲線性索引並將偏移量x
添加到每個列。最後我們用計算的指數替換爲NaN
s。
循環遍歷列,然後在每個柱的成員循環,與南更換前3個非NaN的數字:
for c = 1:size (a,2)
col = a (:,c);
replaced = 0;
for r = 1:size (col)
if (~isnan (col (r)))
a (r,c) = Nan;
replaced = replaced + 1
if (replaced == 3)
break;
end
end
end
end
我認爲應該這樣做
class TestNan
{
public static void main(String[] args)
{
double[][] mat = new double[6][3];
//initialize the matrix here
for(int i = 0; i<3; i++)
{
int x = 3; // no. of numbers to be replaced
for(int j = 0; j<6; j++)
{
if(x == 0)
break;
Double d = Double.valueOf(mat[i][j]);
if(!d.isNaN())
{
d = Double.NaN;
x--;
}
}
}
//Print your matrix here
}
}
嘗試這個,讓我知道如果你遇到任何問題!
錯誤的語言。 –
這是一個矢量化的解決方案。首先將a
(將用新的NaN
s替換的部分)的頂部取入aTopMatrix
。然後把a
的下半部分變成aLowMatrix
。然後根據aTopMatrix
中預先存在的NaN
值,使用邏輯尋址代替aLowMatrix
的值與NaN
。最後,創建一個大小爲x
x size(a,2)
的NaN
數組,並將其與aLowMatrix
垂直連接以獲得b
中所需的結果矩陣。
%定義示例數據:
a = [ 2 NaN NaN; 4 NaN 3; 3 7 9; 5 12 5; 8 10 8; 12 5 10 ]
x = 3
%下面的代碼:
aTopMatrix = a(1:x, 1:end);
aLowMatrix = a(x+1:end, 1:end);
aLowMatrix(isnan(aTopMatrix)) = NaN;
b = [ ones(x, size(a,2))*NaN; aLowMatrix ];
我會試試,謝謝 – mario
我實際上沒有嘗試過運行它,所以我可能已經搞砸了一些語法(我不使用Matlab很多),但應該大多數是正確的,我認爲 – lxop
是的!效果很好,再次感謝 – mario