Matlab匿名函数如果还有

时间:2016-04-26 14:25:22

标签: matlab lambda anonymous-function

在MATLAB中我试图对单元格数组执行一个函数,但运气不好。我想创建一个cellfun来检查str2double是否返回NaN值,然后对不是str2double的值执行NaNs。我试图使用一个带有IF Else类型语句的匿名函数,但实际上并没有到达任何地方。这是我到目前为止所提出的:

x = cellfun(@(x)~isnan(str2double(x)),str2double(x))

然而它不起作用,有人可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

您可以使用逻辑索引:

x = {'1', 'NaN', '2', 'NaN'}
y = str2double(x(~isnan(str2double(x))))

y =
     1     2

这会两次调用str2double,因此如果你需要做一百万次,它可能会运行得有点慢。

编辑:正如Dan所指出的,如果你想更改单元格数组,请使用

x{~isnan(str2double(x))} = str2double(x(~isnan(str2double(x))))

答案 1 :(得分:0)

您可以使用Loren Shure's内联条件来实现此功能:

x = cellfun(@(y)iif(~isnan(str2double(y)), str2double(y), true, y), x, 'uni', 0)

然后你可以尝试

struct nodePatient {
    struct Patient * patient; 
    struct nodePatient * next;
};

struct linkedQueue {
    struct nodePatient * firstNode;
    struct nodePatient * lastNode;
    unsigned size;
    unsigned maxSize;
};


struct PriorityQueue {
    struct linkedQueue * queue;
    int size;
    unsigned minPriorityValue;
};



struct PriorityQueue * createPriorityQueue(unsigned minPriorityValue) {
    struct PriorityQueue * newPriorityQueue = (struct PriorityQueue*) malloc (sizeof (struct PriorityQueue));
    newPriorityQueue->queue = (struct linkedQueue*) calloc (minPriorityValue+1, sizeof (struct linkedQueue));
    int i;

    newPriorityQueue->minPriorityValue = minPriorityValue;
    for(i = 0; i < minPriorityValue; i++) {
        newPriorityQueue->(queue+i)->maxSize = UNLIMITED_SIZE;
        newPriorityQueue->(queue+i)->size = 0;
        newPriorityQueue->(queue+i)->firstNode = NULL;
        newPriorityQueue->(queue+i)->lastNode = NULL;
    } 
    return newPriorityQueue;    
}

答案 2 :(得分:0)

这是一个很好的紧凑且有效的iif实现:

iif = @(varargin) varargin{3-(varargin{1}>0)}

用法:

iif(condition, true_value, false_value)

如果条件的计算结果为true,则函数返回true值,否则返回false_falue。

以下是过滤单元格的有用转换(例如,通过xlsread读取为Ra):

numeric_array = cellfun( @(x) iif(isnumeric(x) & ~isempty(x),x,NaN), Ra);