在MATLAB中我试图对单元格数组执行一个函数,但运气不好。我想创建一个cellfun
来检查str2double
是否返回NaN
值,然后对不是str2double
的值执行NaNs
。我试图使用一个带有IF Else类型语句的匿名函数,但实际上并没有到达任何地方。这是我到目前为止所提出的:
x = cellfun(@(x)~isnan(str2double(x)),str2double(x))
然而它不起作用,有人可以帮助我吗?
答案 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);