Как мне перебирать только определенные части массива ячеек?

Я пытаюсь найти способ сделать цикл for, в котором я могу сравнить две ячейки, которые дадут мне два разных средства. Один для класса char, а другой для класса double.

Это то, что у меня есть до сих пор.

V = {2; 'tree'; 3; 'hope'};
W = {2; 'tree'; 3; 'hope'};


for i = 1:length(V);
    if isequal(class(V{i}), 'double')
        num = V{i}
     elseif isequal(class(V{i}), 'char')
        str = V{i}
    end
end
for i = 1:length(W);
    if isequal(class(W{i}), 'double')
        acc_n(i) = isequal(V{i}, W{i})
    elseif isequal(class(W{i}), 'char')
        acc_s(i) = strcmp(V{i}, W{i})
    end
end
mean_d = mean(acc_n)
mean_s = mean(acc_s)

Вывод, который я получаю:

acc_n =
     1     0     1
acc_s =
     0     1     0     1
mean_d =
    0.6667
mean_s =
    0.5000 

Результат, который я хочу:

1 1 для строки, mean = 1. 1 1 для двойного, mean = 1

Как я могу сделать цикл, в котором он принимает только числа ячейки и слова ячейки отдельно?

Есть ли какой-нибудь способ перебирать только слова или числа?


person user2924450    schedule 01.11.2015    source источник


Ответы (1)


Вы можете сначала извлечь строки и двойные числа и обрабатывать их отдельно, чтобы избежать циклов.

V = {2; 'tree'; 3; 'hope'};
W = {2; 'tree'; 3; 'hope'};

VChar=V(cellfun(@ischar,V));
WChar=W(cellfun(@ischar,W));

acc_s=VChar==WChar;

VNum=cell2mat(V(cellfun(@isnumeric,V)));
WNum=cell2mat(W(cellfun(@isnumeric,W)));

acc_n=VNum==WNum;

Версия цикла: я не проверял это, но это должно работать.

%Assumes V and W have equal number of elements.

acc_n=[];
acc_s=[];
for i=1:numel(V)
    if isequal(class(V{i}), 'double') && isequal(V{i},W{i})
        acc_n=[acc_n true];
    elseif isequal(class(V{i}), 'char') && strcmp(V{i},W{i})
        acc_s=[acc_s true];
    end
end
person Autonomous    schedule 01.11.2015
comment
Есть ли альтернативный способ сделать это без использования Cellfun? - person user2924450; 02.11.2015
comment
Кроме того, как насчет использования цикла для этого? - person user2924450; 02.11.2015
comment
@user2924450 user2924450 Я думаю, что цикл подойдет, поскольку cellfun иногда хуже, чем циклы. См. здесь. Смотрите мою правку. - person Autonomous; 02.11.2015
comment
Код, который вы мне дали для цикла, имеет неопределенные переменные, такие как acc_n и acc_s. Также я понимаю, что происходит, но зачем нам добавлять: numCount=numCount+1; acc_n(numCount)=истина; ‹-- что это делает? - person user2924450; 02.11.2015
comment
Смотрите мою правку. numCount и charCount подсчитывали, сколько переменных char и double было добавлено до сих пор, но это полезно только тогда, когда вы предварительно выделили массив. Я изменил код сейчас. - person Autonomous; 02.11.2015
comment
Проблема в том, что это немного сложно читать и понимать. Мне просто нужен цикл, который индивидуально перебирает строковые элементы и числовые элементы в массиве ячеек. - person user2924450; 02.11.2015
comment
Я не могу сделать это проще, чем это. Проблема с циклическим просмотром строк и чисел по отдельности заключается в том, что вам сначала придется их извлечь. Это то, что я сделал в своем первом решении. Потом ты сказал, что не хочешь мобильного развлечения. Если вы действительно хотите это сделать, подсчитайте числа и символы, используя другой цикл for, а затем выполните сравнение на равенство, которое было бы ненужным. - person Autonomous; 02.11.2015
comment
Спасибо за вашу помощь в любом случае. это было полезно - person user2924450; 02.11.2015