在寻找最小距离的位置时降低计算成本

时间:2015-06-08 06:02:26

标签: matlab

我使用MATLAB作为显示器的校准模型...... 我需要找到如下的值

for a1 = 1:s1
for j = 1:s2
    c=0;
for i = 1:257;
    if ((XYZ1(a1,j,1)-r1(1,i))<0.5)
        rgb(a1,j,1) = a(i);
        c=c+1;
        break;
    end
end

if ((c ==0)|(rgb>255))
    rgb(j,1)=255;
end
c=0;
for i = 1:257;
    if ((XYZ1(a1,j,2)-r1(2,i))<0.5)
        rgb(a1,j,2) = a(i);
        c=c+1;
        break;
    end
end


if ((c ==0)|(rgb>255))
    rgb(a1,j,2)=255;
end
c=0;

for i = 1:257;
    if ((XYZ1(a1,j,3)-r1(3,i))<0.5)
        rgb(a1,j,3) = a(i);
        c=c+1;
        break;
    end
end
if ((c ==0)|(rgb>255))
    rgb(a1,j,3)=255;
    c=c+1;
end

end
a1
end

我的代码工作非常精细,结果很好......但唯一的问题是计算成本,因为XYZ1的大小是2448x2048x3所以这三个循环如果条件需要花费很多时间。我需要帮助来降低计算成本。基本上这三个循环导致延迟

for i = 1:257;
    if ((XYZ1(a1,j,1)-r1(1,i))<0.5)
        rgb(a1,j,1) = a(i);
        c=c+1;
        break;
    end
end

if ((c ==0)|(rgb>255))
    rgb(j,1)=255;
end
c=0;
for i = 1:257;
    if ((XYZ1(a1,j,2)-r1(2,i))<0.5)
        rgb(a1,j,2) = a(i);
        c=c+1;
        break;
    end
end


if ((c ==0)|(rgb>255))
    rgb(a1,j,2)=255;
end
c=0;

for i = 1:257;
    if ((XYZ1(a1,j,3)-r1(3,i))<0.5)
        rgb(a1,j,3) = a(i);
        c=c+1;
        break;
    end
end
if ((c ==0)|(rgb>255))
    rgb(a1,j,3)=255;
    c=c+1;
end

任何建议都将受到高度赞赏

1 个答案:

答案 0 :(得分:0)

您可以使用逻辑索引或find代替循环。而不是

c = 0;
for i = 1:257;
    if ((XYZ1(a1,j,1)-r1(1,i))<0.5)
        rgb(a1,j,1) = a(i);
        c=c+1;
        break;
    end
end
你可以:

c   = find((XYZ1(a1,j,1)*ones(1,257) - r1(1,1:257)) > 0.5, 1, 'last');
if (~isempty(c))
    rgb(ai,j,1) = a(c-1);
else
    c = 0;
end