开发者

MATLAB: Using the If statement with a string to return values from other arrays

I have a matlab program where I am importing some arrays from excel. I am trying to write an if statement that looks in the first array, say:

Thing-1 Thing-1     Thi开发者_开发技巧ng-3     Thing-5

If a column is a "Thing-1", then it goes to a different array, and calculates 3 values that are to be given different variable names...any guidance would be much appreciated! Thanks!


You need a function like vlookup as in Excel.

I have written one. Here is the source code:

function [content, index] = vlookup(m, e, column, lookcolumn)


if isempty(m) || isempty(e), return; end
if nargin <= 3, lookcolumn = 1; end

isechar = ischar(e);
assert(isechar || isnumeric(e), 'the second parameter must be a string or numeric');

if iscell(m)
    content = {}; index = [];
    if isechar
        index = find(strcmp(e, m(:, lookcolumn)));
        content = m(index, column);
    else
        for i = 1:size(m, 1)
            if isnumeric(m{i, lookcolumn}) && m{i, lookcolumn} == e
                content = [content; m(i, column)]; %#ok<*AGROW>
                index = [index; i];
            end
        end
    end
else
    assert(~isechar, 'When the first para is a matrix, the second para must be numeric');

    index = find(m(:, lookcolumn) == e);
    content = m(index, column);
end


The question is... not very clear, but let me try and give you some suggestions.

Say you read some data from an Excel workbook in which the first row is headers, followed by lots of rows with numbers.

[num,txt] = xlsread(excelFileName);

so that num contains the numeric data and txt the string column headers.

Then you can check for the string Thing-1 in the column headers. thingOneIdx is an array with indices into the columns of the header. In your example, it would be [1 2], since the first two columns are Thing-1.

thingOneIdx = find(strcmp('Thing-1',txt));

You can create three cell arrays, firstValue, secondValue, and thirdValue that will store the results of the three calculations. If you need to keep the Thing-1 data around in an additional array, you can do that analogously.

%# define cell arrays (do it in one go using deal)
[firstValue,secondValue,thirdValue] = deal(cell(length(thingOneIdx),1));

%# for simplicity and readability, loop through isThingOneIdx to assign data
for ct = 1:length(thingOneIdx)
    myIdx = thingOneIdx(ct);
    firstValue{ct} = someCalculation(num(myIdx,:));
    secondValue{ct} = someOtherCalculation(num(myIdx,:));
    %# etc
end
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜