Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 绘制大量不同颜色的正方形_Matlab_Plot_Matlab Figure - Fatal编程技术网

Matlab 绘制大量不同颜色的正方形

Matlab 绘制大量不同颜色的正方形,matlab,plot,matlab-figure,Matlab,Plot,Matlab Figure,我正在尝试加速我继承的一些代码,这些代码围绕图像上定义的坐标绘制方框。盒子的数量通常在1000-6000之间。目前,它在plot()函数周围使用for循环,传递5个坐标以绘制长方体 我正在尝试重新编写它,以便使用对plot()的单个调用,据我所知,这是一种更有效的渲染方法。我已经生成了一个x和y坐标数组,我可以将其传递到绘图,以及一个RGB三元组数组,用于定义每条线的颜色(每个框都有此颜色显示的状态)。我可以将它们与'defaultaxescolorder'属性一起使用,但我需要它来停止将每个正

我正在尝试加速我继承的一些代码,这些代码围绕图像上定义的坐标绘制方框。盒子的数量通常在1000-6000之间。目前,它在
plot()
函数周围使用for循环,传递5个坐标以绘制长方体

我正在尝试重新编写它,以便使用对
plot()
的单个调用,据我所知,这是一种更有效的渲染方法。我已经生成了一个x和y坐标数组,我可以将其传递到绘图,以及一个RGB三元组数组,用于定义每条线的颜色(每个框都有此颜色显示的状态)。我可以将它们与
'defaultaxescolorder'
属性一起使用,但我需要它来停止将每个正方形连接在一起

我已经研究了
'defaultAxesLineStyleOrder'
属性,但据我所知,它只在一个完整的颜色循环之后循环样式,在这种情况下不起作用。我真正需要的是一种方法,让它为5个点画线,然后为下一个点画线,然后重复

有没有什么方法可以让渲染速度不会太慢

编辑:以下是迄今为止的新代码:

编辑2:我已经设法阻止它使用NaN值在正方形之间绘制线来分隔每个正方形。我从Mathworks文档中获得了优化线条图的技术,我现在找不到适合我一生的URL。我已经更新了下面的代码

numObjs = size(MYDATA.objectInformation, 1);
if isfield(MYDATA, 'objectInformation')
    if (numObjs > 0)

        padding = MYDATA.preferences.boxSize/2;

        % Array of coords. 6* the number of objects (takes 5 points to draw
        % a square + NaN gap hack)
        objCoords = zeros(6*numObjs, 2);
        objCoordsIndex = 1;

        % array of line colours for defaultAxesColorOrder
        objColours = zeros(6*numObjs, 3);

        % Add each object to array
        for loop = 1:numObjs

            x_seed = MYDATA.objectInformation{loop, 1};
            y_seed = MYDATA.objectInformation{loop, 2};
            status = MYDATA.objectInformation{loop, 3};

            % set coords to draw bounding box
            objCoords(objCoordsIndex    , 1:2) = [(x_seed - padding), (y_seed - padding)];  % bottom left
            objCoords(objCoordsIndex + 1, 1:2) = [(x_seed - padding), (y_seed + padding)];  % top left
            objCoords(objCoordsIndex + 2, 1:2) = [(x_seed + padding), (y_seed + padding)];  % top right
            objCoords(objCoordsIndex + 3, 1:2) = [(x_seed + padding), (y_seed - padding)];  % bottom right
            objCoords(objCoordsIndex + 4, 1:2) = [(x_seed - padding), (y_seed - padding)];  % bottom left
            objCoords(objCoordsIndex + 5, 1:2) = [NaN, NaN];  % gap!

            % set colour depending on status
            % NOTE: doesn't use preferences due to effort of converting
            % short colour names with line style modifiers to RGB triplets
            if strcmp(status, 'Interesting object') || strcmp(status, 'Interesting object - manually tagged')
                colour = [0 1 0];
            elseif strcmp(status, 'Not interesting')
                colour = [1 0 0];
            else    % If not processed/other status
                colour = [0 0 1];
            end

            for i = 1:5
                objColours(objCoordsIndex + i - 1, 1:3) = colour;
            end

            objCoordsIndex = objCoordsIndex + 5;

        end

        % Define line colours

        % Plot array
        plot(MYDATA.imagePanelHandles.mainAxes, objCoords(:, 1), objCoords(:, 2));
    end
end
如果有人想看,下面是旧代码:

    if isfield(MYDATA, 'objectInformation')
    if (size(MYDATA.objectInformation, 1) >= 1)
        for loop = 1:size(MYDATA.objectInformation, 1)

            x_seed = MYDATA.objectInformation{loop, 1};
            y_seed = MYDATA.objectInformation{loop, 2};
            status = MYDATA.objectInformation{loop, 3};

            %form MYDATA.preferences.boxSize/2 pixel wide box around seed
            padding = MYDATA.preferences.boxSize/2;

            x = [(x_seed - padding), (x_seed - padding), (x_seed + padding), (x_seed + padding), (x_seed - padding)];
            y = [(y_seed - padding), (y_seed + padding), (y_seed + padding), (y_seed - padding), (y_seed - padding)];

            if strcmp(status,'Not yet processed')
                plot(MYDATA.imagePanelHandles.mainAxes,x,y,MYDATA.preferences.notProcessedBoxColour)
            elseif strcmp(status, 'Interesting object') || strcmp(status, 'Interesting object - manually tagged')
                plot(MYDATA.imagePanelHandles.mainAxes,x,y,MYDATA.preferences.interestingObjectBoxColour)
            elseif strcmp(status, 'Not interesting')
                plot(MYDATA.imagePanelHandles.mainAxes,x,y,MYDATA.preferences.notInterestingBoxColour)
            else % be cautious and catch anything that has fallen through
                plot(MYDATA.imagePanelHandles.mainAxes,x,y,'-r')
            end
        end
    end

我通过利用
plot()
函数为每个坐标获取二维数组的能力解决了这个问题。每一列都自动以不同的颜色绘制,所以我所要做的就是创建一个X坐标数组和一个Y坐标数组,其中每一行表示一个对象的坐标,每一行表示其状态。以下是文件的相关部分:

这是我的最终代码:

numObjs = size(MYDATA.objectInformation, 1);
if isfield(MYDATA, 'objectInformation')
if (numObjs > 0)

    padding = MYDATA.preferences.boxSize/2;

    % Arrays of coords. 6* the number of objects (takes 5 points to draw
    % a square + NaN gap hack)
    objCoordsX = NaN(6*numObjs, 3);
    objCoordsY = NaN(6*numObjs, 3);
    objCoordsIndex = 1;

    % Add each object to array
    for loop = 1:numObjs

        x_seed = MYDATA.objectInformation{loop, 1};
        y_seed = MYDATA.objectInformation{loop, 2};
        status = MYDATA.objectInformation{loop, 3};

        % set column to write to depending on status
        if strcmp(status, 'Interesting object') || strcmp(status, 'Interesting object - manually tagged')
            statusColumn = 1;
        elseif strcmp(status, 'Not interesting')
            statusColumn = 2;
        else    % If not processed/other status
            statusColumn = 3;
        end

        objCoordsX(objCoordsIndex    , statusColumn) = x_seed - padding;  % bottom left
        objCoordsX(objCoordsIndex + 1, statusColumn) = x_seed - padding;  % top left
        objCoordsX(objCoordsIndex + 2, statusColumn) = x_seed + padding;  % top right
        objCoordsX(objCoordsIndex + 3, statusColumn) = x_seed + padding;  % bottom right
        objCoordsX(objCoordsIndex + 4, statusColumn) = x_seed - padding;  % bottom left

        objCoordsY(objCoordsIndex    , statusColumn) = y_seed - padding;  % bottom left
        objCoordsY(objCoordsIndex + 1, statusColumn) = y_seed + padding;  % top left
        objCoordsY(objCoordsIndex + 2, statusColumn) = y_seed + padding;  % top right
        objCoordsY(objCoordsIndex + 3, statusColumn) = y_seed - padding;  % bottom right
        objCoordsY(objCoordsIndex + 4, statusColumn) = y_seed - padding;  % bottom left

        objCoordsIndex = objCoordsIndex + 6;    % 5 coords to draw box + NaN gap in line

    end

    % Plot coords
    plot(MYDATA.imagePanelHandles.mainAxes, objCoordsX, objCoordsY);
end

虽然我知道它仍然会涉及多个调用,因此可能不会加快速度,但Matlab有一个对您可能有用的
rectangle
函数。我第一次尝试使用
rectangle()
而不是
plot()
,但它对速度的影响是不明显的。