Algorithm 选择最独特的标记、线条样式和颜色

Algorithm 选择最独特的标记、线条样式和颜色,algorithm,matlab,Algorithm,Matlab,我想自动选择线条样式、标记和颜色。我希望有这样一个函数: function [selected_lineStyles, selected_markers, selected_colours] = plot_lineStyle_markers_and_colours(i) linestyles = {'-', '--', ':', '-.'}; colours = {'red', [0.0, 220.0, 0.0]./255.0, 'blue', 'black', [255.0,

我想自动选择线条样式、标记和颜色。我希望有这样一个函数:

function [selected_lineStyles, selected_markers, selected_colours] = plot_lineStyle_markers_and_colours(i)
    linestyles = {'-', '--', ':', '-.'};
    colours = {'red', [0.0, 220.0, 0.0]./255.0, 'blue', 'black', [255.0, 180.0, 0.0]./255.0, [0.0, 128.0, 0.0]./255.0, [0.0, 255.0, 255.0]./255.0, [1.0, 0.0, 1.0]};
    markers = {'d', '*', '+', 'x', 'o', 's', '^', 'v', '.', '>', '<', 'p', 'h'};
    num_different_lineStyles = numel(linestyles);
    num_different_markers = numel(markers);
    num_different_colours = numel(colours);
    num_different_combinations = num_different_markers*num_different_lineStyles*num_different_colours;
    if any(i(:) > num_different_combinations)
        warning('Not enough unique combinations of line styles, markers and colours available!');
    end
    i = 1 + mod(i - 1, num_different_combinations);
    [lineStyle_i, marker_i, colour_i] = ind2sub([num_different_lineStyles, num_different_markers, num_different_colours], i);
    selected_lineStyles = linestyles(lineStyle_i);
    selected_markers = markers(marker_i);
    selected_colours = colours(colour_i);
end
此函数返回不同的线型,但标记和颜色相同

但我希望它是这样的:对于I=1,它应该返回第一个线型、第一个标记和第一种颜色。对于i=2,它应返回第二个线型、第二个标记和第二种颜色。与i=3和i=4相同。对于i=5,必须第一次重复线型,因为其中只有4个。但是,该函数应返回第五种颜色和第五个标记

一般来说,线型、标记和颜色的“最独特”组合应返回低i,以便在绘图中易于区分

我不知道如何用数学来表达,甚至解决这个问题。我想我们必须沿着n维非正方形数组的对角线走


有人能帮我解决这个问题,或者给我指出正确的方向吗?

我第一次误解了这个问题,我不得不想一想

如果您愿意通过添加或减去颜色或线条样式来更改列表,那么可以利用三个列表中每个列表的元素数量都是相同的这一事实来进行更改。如果你有两个互质数N和M,那么最小公倍数将是N×M。如果你有第三个相互互质的数P,那么最小公倍数将是N×M×P,以此类推

这对你的列表意味着,如果你在每一步上不断增加每个索引,你将不会在很长时间内重复一个组合。您有4种线条样式、8种颜色和13个标记。如果添加颜色(例如,中性灰色
[0.5 0.5 0.5]
),则有4、9和13,它们都是互质

% Define your combinations, with neutral grey added to the end of the color choices.
linestyles = {'-', '--', ':', '-.'};
colours = {'red', [0.0, 220.0, 0.0]./255.0, 'blue', 'black', [255.0, 180.0, 0.0]./255.0, [0.0, 128.0, 0.0]./255.0, [0.0, 255.0, 255.0]./255.0, [1.0, 0.0, 1.0], [0.5 0.5 0.5]};
markers = {'d', '*', '+', 'x', 'o', 's', '^', 'v', '.', '>', '<', 'p', 'h'};

% Count the values in each cell array 
ldx = numel(linestyles); % = 4
cdx = numel(colours); % = 9
mdx = numel(markers); % = 13

% Make each cycle the same length
LDX = repmat(1:ldx, [1 cdx*mdx]);
CDX = repmat(1:cdx, [1 ldx*mdx]);
MDX = repmat(1:mdx, [1 ldx*cdx]);

x = 1:10
y = x;
for idx = 1:numel(LDX)
    % Pick out the current combination
    currentLineStyle = LDX(idx);
    currentMarker = MDX(idx);
    currentColour = CDX(idx);

    % Plot your data here...
    line(x, y, 'Color', currentColour, 'LineStyle', currentLineStyle, 'Marker', currentMarker)
end
%定义您的组合,在颜色选择的末尾添加中性灰色。
线型={'-','-',':','-.};
颜色={'red'、[0.0,220.0,0.0]./255.0、'blue'、[255.0,180.0,0.0]./255.0、[0.0,128.0,0.0]./255.0、[0.0,255.0]./255.0、[1.0,0.0,1.0]、[0.50.5,0.5];

markers={'d'、'*'、'+'、'x'、'o'、's'、'^'、'v'、'>'、“我注意到有一种叫做数组元素到主数组对角线的距离的东西,我希望索引按此距离的升序排列。对于三维下标索引
a
,此距离定义为
sum(abs)([a(1)-a(2),a(2)-a(3),A(3)-A(1)])
。现在我使用此功能:

function subs_sorted_by_dist_from_main_diagonal = subs_sorted_by_dist_from_main_diagonal(siz)
    d = numel(siz);
    n = prod(siz);
    i = arrayfun(@(n)1:n, siz, 'UniformOutput', false);
    sub = cell(1, d);
    [sub{:}] = ndgrid(i{:});

    sub2 = zeros(n, d);
    for j = 1:d
        sub2(:, j) = sub{j}(:);
    end

    dist_from_main_diagonal = sum(abs(sub2 - sub2(:, [2:end, 1])), 2);

    [~, sort_index] = sort(dist_from_main_diagonal, 'ascend');

    subs_sorted_by_dist_from_main_diagonal = sub2(sort_index, :);
end

这不是最优的,因为它对所有下标索引进行排序,而不是不排序就生成它们。

这不是我想要的。我知道如何获得所有可能的排列。我想知道的是如何对这些排列进行排序,例如,前4个返回的颜色、线型和标记都是不同的!示例:I=1:color:red,linestyle:-,marker:+i=2:color:blue,linestyle:-,marker:*i=3:color:green,linestyle:-,marker:oi=4:color:black,linestyle:,marker:x这样做的原因是:它更可能只打印几个数据集(i=1:4或i=1:10)比使用所有可能的416排列更重要。@Procyon,试试这个答案。我第一次误解了,花了我一点时间思考这个问题。谢谢你的回答。我注意到有一个东西叫做数组元素到主数组对角线的距离,我想让这个距离的索引按升序排列更多信息,请参见我对自己问题的回答。
function subs_sorted_by_dist_from_main_diagonal = subs_sorted_by_dist_from_main_diagonal(siz)
    d = numel(siz);
    n = prod(siz);
    i = arrayfun(@(n)1:n, siz, 'UniformOutput', false);
    sub = cell(1, d);
    [sub{:}] = ndgrid(i{:});

    sub2 = zeros(n, d);
    for j = 1:d
        sub2(:, j) = sub{j}(:);
    end

    dist_from_main_diagonal = sum(abs(sub2 - sub2(:, [2:end, 1])), 2);

    [~, sort_index] = sort(dist_from_main_diagonal, 'ascend');

    subs_sorted_by_dist_from_main_diagonal = sub2(sort_index, :);
end