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