Почему я не могу использовать логические операторы короткого замыкания на векторах в Matlab? - PullRequest
0 голосов
/ 15 декабря 2011

FD - это файл Excel, A - данные из столбца FD 5. (Каждая ячейка столбца 5 содержит 1, 2 или 3)

Если ячейка в столбце 5 в FD содержит 2 или 3, то ... иначе, если ячейка в столбце 5 в FD включает 1 или 3, тогда .. ... в противном случае все ячейки в столбце 5 включают только 1, затем .. ...

A = FD (:, 5); Матрица C = 3x3

If A == 2 || A == 3
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif A == 1 || A == 3
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif A == 1 || A == 2
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif A == 1
   Avg = C(1,1)/sum(sum(C));
elseif A == 2
   Avg = C(2,2)/sum(sum(C));
elseif A == 3
   Avg = C(3,3)/sum(sum(C));
else
   Avg = sum(diag(C)./sum(C,2))/3;
end

Однако в приведенном выше коде есть ошибка. ??? Операнды к || и операторы && должны быть преобразованы в логические скалярные значения.

Кто-нибудь может помочь?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Операторы сокращения действуют только для скалярных величин. Суть операторов быстрого доступа заключается в том, что RHS не оценивается, если в этом нет необходимости. Таким образом, в следующем примере A==2 никогда не оценивается:

A = 1;
I = A == 1 && A == 2

Имея это в виду, что должно делать следующее?

A = [1 3]
I = A == 1 && A == 2;

Кроме того, условия if должны иметь скалярные условия. Что должен делать этот код?

if [true false], disp('true'), else disp('false'), end

Вы, вероятно, хотите, чтобы all или any комбинировали векторные элементы.

В любом случае, я думаю, что у вас также есть предложения if в неправильном порядке. Попробуйте:

if all(A == 1)
   Avg = C(1,1)/sum(sum(C));
elseif all(A == 2)
   Avg = C(2,2)/sum(sum(C));
elseif all(A == 3)
   Avg = C(3,3)/sum(sum(C));
elseIf all(A == 2 | A == 3)
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif all(A == 1 | A == 3)
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif all(A == 1 | A == 2)
   Avg = sum(diag(C)./sum(C+eps,2))/2;
else
   Avg = sum(diag(C)./sum(C,2))/3;
end
1 голос
/ 15 декабря 2011

Вы не можете использовать операции короткого замыкания на массивах в Matlab. Это вполне логично, если подумать. Операторы короткого замыкания останавливают вычисление, если первый операнд заставляет выражение быть истинным / ложным независимо от других операндов. Но это не может быть правдой для векторов.

Итак, попробуйте использовать "|" и "&" вместо "||" и "&&"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...