文章原創,轉載請註明出處
MATLAB中矩陣數組的下標是從1開始計數的而C語言或者C++之中則是從0開始的,而且MATLAB中矩陣的單個索引值訪問時是按列方向計數的,而C/C++中則是按行方向計數的,在考慮將MATLAB算法或者程序移植爲C/C++時必須要考慮到這兩點不同,否則會得到錯誤的結果或者造成指針訪問越界錯誤。
通過下面的程序可以將MATLAB中二維矩陣索引值轉換爲元素下標以及轉爲C語言數組下標.
function [row,col]=convertMatlabsq2Csq(index,sizeh,sizew)
%將MATLAB中二維矩陣一維線性索引值轉換爲元素二維下標以及轉爲C語言數組下標
%求取matlab中的列座標
col=floor(index/sizeh);
if col<index/sizeh %非最後一行元素的列號
col=col+1;
end
%求取matlab中的行座標
row=index-sizeh*(col-1);%計算非第一列和非最後一行的元素行號
if col==1%第一列對應的行號
row=index;
end
if row==0%最後一行元素的行號
row=sizeh;
end
%下面轉爲C語言矩陣數組
row=row-1;
col=col-1;
end
測試程序:
A=[5 7 8 3 0;%二維測試矩陣
0 3 2 4 1;
1 4 6 2 9];
[sizea1,sizea2]=size(A);
Ai=zeros(sizea1,sizea2);%matlab中的一維線性索引值計數矩陣
B=zeros(sizea1,sizea2);
Bi=zeros(sizea1,sizea2);%C/C++中的一維線性索引值計數矩陣
%填充matlab中的一維線性索引值計數值
for i=1:sizea2
for j=1:sizea1
Ai(j,i)=sizea1*(i-1)+j;
end
end
%測將一維線性索引值轉換爲元素二維下標
for L=1:sizea1*sizea2
[xc,yc]=convertMatlabsq2Csq(Ai(L),sizea1,sizea2);%將matlab中的一維線性索引值轉化爲元素下標
Bi(L)=xc*sizea2+yc;%填充C/C++中的一維線性索引值計數值
B(xc+1,yc+1)=A(Ai(L));%檢查轉換後的下標對應是否正確
end
運行輸出結果如下:
>> A
A =
5 7 8 3 0
0 3 2 4 1
1 4 6 2 9
>> B
B =
5 7 8 3 0
0 3 2 4 1
1 4 6 2 9
>> Ai
Ai =
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15
>> Bi
Bi =
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14