2015-05-22 143 views
0

我試圖將簡單的C代碼轉換爲matlab,但是我一開始似乎很清楚,這個細分市場在做什麼? SIZE_N2 = 25,w = 533,h = 800將此C++代碼轉換爲Matlab

//Init the L matrix. L is a sparse matrix that only contains SIZE_N2 non-zero elements per row. 
//We store the L matrix in an array with one row per image pixel and one column per non-zero value. 
//Each array cell accumulates values according to equation 11. 
LMatrix = new double* [w*h]; 
for(i=0; i<w*h; i++){ 
    LMatrix[i] = new double[SIZE_N2]; 
    for(j=0; j<SIZE_N2; j++){ 
     LMatrix[i][j] = 0; 
    } 
} 

是不是在Matlab中創建這個矩陣?

LMatrix =零(SIZE_N2,w * h);

當我運行這個代碼,矩陣超出邊界上一個for循環。

任何人都知道這個的正確實施?

謝謝!

+0

請注意,你有C++,而不是C代碼。 (你應該改變標籤) –

+0

我認爲你不需要循環,絕對做'LMatrix =零(SIZE_N2,w * h)',希望解決這個問題,矩陣的維數將是'SIZE_N2 x(w * h)' – Subinoy

+0

但我正是那樣做的!但是,在代碼的下一部分,它超出了矩陣大小的大小。那麼,你是否說我做了正確的工作來改變它? – Yasin

回答

2

首先,這將是有益的參考source code(以防萬一)和一些documentation about it的全部(所以我們知道,例如什麼「方程11」是)。現在

,如果我理解正確的代碼,一切(包括循環)可以在MATLAB替換爲以下幾點:

LMatrix = sparse([],[],[],w*h,w*h,SIZE_N2*h); 

除非你事先在非零元素應該是知道的,在這種情況下,你可以在那裏構造最終的稀疏矩陣,然後使用其他語法之一(docs1,docs2)。

+0

謝謝!我不知道Matlab中的稀疏矩陣命令,我正在看看它,儘管我對稀疏矩陣知之甚少。 – Yasin

+0

@ Dev-iL,在您的版本中,非零元素的總數爲SIZE_N2 * h,矩陣的大小爲[w * h,w * h],但在源代碼C++代碼中,SIZE_N2表示每行中非零元素的數量,具有大小爲[w * h,SIZE_N2]的矩陣。對? –

+0

@Atomic_alarm描述對我來說比這個例子中的代碼更有幫助 - 它說「_L是一個稀疏矩陣,它只包含每行的SIZE_N2非零元素._」=>根據我的數學,每行__SIZE_N2 = SIZE_N2 * h__非零元素。這裏的要點是,在MATLAB中的稀疏矩陣中,您可以自由地使用矩陣的完整_尺寸來工作(純粹爲了方便),但只關心非零元素。恕我直言,最好不要只是翻譯代碼,但要了解你在做什麼,以及如何在MATLAB中做這件事可以使你受益。 –

1

你的C的最直接的翻譯++代碼到MATLAB是

LMatrix = zeros(w*h, SIZE_N2) 

注意,在代碼中的第一個索引(行數)有大小w*h,和你交換他們周圍。這就是爲什麼你跳出界限錯誤的原因,因爲你用錯誤的方式編制索引。

我還會提到C++使用基於0的索引,而MATLAB使用基於1的索引。這絆倒你,你必須非常非常小心,在翻譯代碼時總是給你的索引加1。