HowTo: выбрать все строки в массиве ячеек, где конкретный столбец имеет определенное значение - PullRequest
3 голосов
/ 17 января 2012

У меня есть массив ячеек A. Я хотел бы выбрать все строки, где первый столбец (например) имеет значение 1234 (например).

Когда A не является массивом я, яможет сделать это следующим образом:

B = A(A(:,1) == 1234,:);

Но когда A является массивом ячеек, я получаю это сообщение об ошибке:

error: binary operator `==' not implemented for `cell' by `scalar' operations

Кто-нибудь знает, как это сделать, для массив ячеек ?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2012

Проблема в выражении a(:,1) == 1234 (а также a{:,1} == 1234).

Например:

octave-3.4.0:48> a
a = 
{
  [1,1] =  10
  [2,1] =  13
  [3,1] =  15
  [4,1] =  13
  [1,2] = foo
  [2,2] =  19
  [3,2] = bar
  [4,2] =  999
}
octave-3.4.0:49> a(:,1) == 13
error: binary operator `==' not implemented for `cell' by `scalar' operations
octave-3.4.0:49> a{:,1} == 13
error: binary operator `==' not implemented for `cs-list' by `scalar' operations

Я не знаю, является ли это самым простым или наиболее эффективным способом сделать это, но это работает:

octave-3.4.0:49> cellfun(@(x) isequal(x, 13), a(:,1))
ans =

   0
   1
   0
   1

octave-3.4.0:50> a(cellfun(@(x) isequal(x, 13), a(:,1)), :)
ans = 
{
  [1,1] =  13
  [2,1] =  13
  [1,2] =  19
  [2,2] =  999
}
0 голосов
/ 06 ноября 2018

Полагаю, класс A равен cell. (Вы можете увидеть в поле Рабочая область).

Таким образом, вам может потребоваться преобразовать A в матрицу по cell2mat(A).

Тогда, точно так же, как Матлаб, как и вы: B = A(A(:,1) == 1234,:);

0 голосов
/ 02 февраля 2012

В данный момент у меня нет октавы, чтобы попробовать его, но я верю, что это сделает следующее:

B = A(A{:,1} == 1234,:);

Когда работа с ячейками () возвращает ячейку, {} возвращаетсодержимое ячейки.

...