MATLAB中通过矩阵索引值求元素下标以及转为C语言数组下标

文章原创,转载请注明出处

 

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

 

你可能感兴趣的:(c,算法,测试,matlab,BI,语言)