如何处理可变长度的单元字符串数组作为函数的输入参数

时间:2017-06-09 18:05:39

标签: matlab plot cell-array

我有一个函数可以在一个绘图上绘制多个系列,给出一个需要作为系列的表头的列表。我不确定如何在一个参数点中考虑变量输入,它接受字符串或字符串的单元格数组,具体取决于系列应该如何明确细分。例如,将其称为

table2multiseries(myTable, 'Xvals', 'Yvals', 'name');

将绘制x vs y,其中每个系列用于不同的名称,即" John"," Rob"等。

或者可以使用单元格数组为系列名称调用它,如下所示:

table2multiseries(myTable, 'Xvals', 'Yvals', {'name', 'trial'});

这将绘制x vs y,其中每个系列用于不同的名称和试验编号,即" John - 1"," John - 2"," Rob - 1"," Rob - 2"等

这是代码,其中有一个if语句,当前为sName的帐户是1,2或3个字符串。毫无疑问,这是一项黑客工作,因为它重复了大约3次。我想知道如何简化它以处理任何长度的系列名称标准输入。有什么想法吗?

function figHandle = table2multiseries(tb, xName, yName, sName)

    figHandle = figure;
    hold on;

    sList = unique(tb{:, sName}, 'rows');

    if ischar(sName)

        for k = 1:length(sList)
            iRows = tb{:, sName}==sList(k,1);
            leg{sList==s} = [sName ' ' num2str(s)];

            tbtemp = tb(iRows, :);
            tbtemp = sortrows(tbtemp, xName);
            plot(tbtemp{:, xName}, tbtemp{:, yName}, '-o')
        end

    elseif iscellstr(sName) && length(sName)==2

        for k = 1:length(sList)
           iRows = tb{:, sName{1}}==sList(k,1) & tb{:, sName{2}}==sList(k,2)
           leg{k,1} = [sName{1} ' ' num2str(sList(k,1)) ' - ' sName{2} ' ' num2str(sList(k,2)) ];

           tbtemp = tb(iRows ,:);
           tbtemp = sortrows(tbtemp, xName);
           plot(tbtemp{:, xName}, tbtemp{:, yName}, '-o')
        end

    elseif iscellstr(sName) && length(sName)==3

        for k = 1:length(sList)
           iRows = tb{:, sName{1}}==sList(k,1) & tb{:, sName{2}}==sList(k,2) & tb{:, sName{3}}==sList(k,3);
           leg{k,1} = [sName{1} ' ' num2str(sList(k,1)) ' - ' sName{2} ' ' num2str(sList(k,2)) ' - ' sName{3} ' ' num2str(sList(k,3)) ];    

           tbtemp = tb(iRows, :);
           tbtemp = sortrows(tbtemp, xName);
           plot(tbtemp{:, xName}, tbtemp{:, yName}, '-o')   
        end

    end

    title(tb.Properties.Description)
    legend(leg);

end

0 个答案:

没有答案