LINUX.ORG.RU

Магия cell2mat в octave

 ,


1

2

Доброго времени суток. Думаю, комментарии излишни, взгляните на код и, пожалуйста, объясните логику возникновения ошибки...

  7 death_records = sql.query('SELECT height, weight, age, death_date, surgery_date FROM heart_surgery WHERE death_date is not null LIMIT 10;')(2:end, :);
  8 
  9 death_records(:, 1)
 10 death_records(:, 2)
 11 cell2mat(death_records(:, 1))
 12 cell2mat(death_records(:, 2))

Вывод:

ans = 
{
  [1,1] = 168
  [2,1] = 156
  [3,1] = 167
  [4,1] = 164
  [5,1] = 170
  [6,1] = 156
  [7,1] = 155
  [8,1] = 174
  [9,1] = 173
  [10,1] = 177
}
ans = 
{
  [1,1] = 65
  [2,1] = 50
  [3,1] = 53
  [4,1] = 60
  [5,1] = 80
  [6,1] = 69
  [7,1] = 63
  [8,1] = 86
  [9,1] = 68
  [10,1] = 108
}
ans =

168
156
167
164
170
156
155
174
173
177

error: cat: dimension mismatch
error: called from
    cell2mat at line 83 column 11
    wtf at line 12 column 1


если указать LIMIT 9, то ошибки не возникает. Но мне нужно гораздо больше 10 записей извлечь... Похоже на баг, а причиной является увеличинная разрядность числа. Есть идеи, как иначе поместить данные в вектор? В этом коде тоже баг?

vec = zeros(1, length(death_records));
for i = 1:length(death_records)
    death_records{i, 1}
    vec(i) = death_records{i, 1}
endfor

ans = 168
error: test: =: nonconformant arguments (op1 is 1x1, op2 is 1x3)
error: called from
    test at line 11 column 9
Rot1
() автор топика
Ответ на: комментарий от Rot1

спрошу из любопытства:

(хотя в октавии ни бум-бум): а как там с размерностью death_records? это 1Д или 2Д массив? Во втором случае что выдаст length(death_records)?

и зачем нужна строка сразу за фор?

sshestov
()

Потому что ваш матлаб - убогонький недоязычок. Для серьёзных вычислений - только FORTRAN 77.

anonymous
()
Ответ на: комментарий от anonymous

В матлабе и ООП, и лямбды давно есть, и библиотеки закачаешься!

anonymous
()
Ответ на: спрошу из любопытства: от sshestov

сразу за for строка, чтобы продемонстрировать данные, которые я пытаюсь записать в вектор (ans = 168). Не смотря на то, что это скаляр, в ошибке указано, что 168 - это 1x3 величина.

Rot1
() автор топика
Ответ на: комментарий от Rot1

ну фиг знает...

в IDL есть reform(), который массив 1х3 превращает в массив размером 3. Может и здесь что-то такое нужно? Кроме того, раз у вас там так строго, может и vec - это тоже 1х10 и нужно писать vec{1,i}?

sshestov
()

Я ошибся, когда подумал, что это баг на стороне octave, с ним все замечательно. Дело в том, что я использую mex-mariadb для обращения к бд. К сожалению, этот проект слабо задокументирован, на скорую руку. Оказывается, что в режиме вывода 'cell' все ячейки имеют строковый тип. В частности 168 является стокой из 3-х символов - отсюда и ошибки типа

test: =: nonconformant arguments (op1 is 1x1, op2 is 1x3)
решение данной неприятности простое - использовать функцию str2num в стандартном пакете для конвертации строки в число.

Всем спасибо, кто откликнулся

Rot1
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.