Добавить число ко всем отрицательным значениям в 4D матрице - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть матрица DirModel размером 2x2x29x1739.Я хочу добавить 360 ко всем отрицательным значениям в этой матрице, но код, который я использую, не поддерживает размеры этой матрицы, он превращает ее в массив:

Neg=DirModel<0;
DirModel2=DirModel(Neg)+360;

Я нашел несколько комбинацийэто онлайн, но ни один из них, кажется, не отстает от размеров.Я хотел бы сделать это без использования петель.Любой ответ приветствуется!

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

В качестве однострочного ответа я предлагаю DirModel2 = mod(DirModel,360) + ~mod(DirModel,360)*360;

mod(DirModel,360) само по себе добавит 360 к любому отрицательному числу, но также увеличит 360 до 0.Чтобы избежать этого, мы добавляем 360, если результат mod(DirModel,360) равен 0 (то есть ~mod(DirModel,360) равен 1).


С новой информацией из OP, начальные данные находятся в диапазоне от -180 до 180и без проблем, если 0 меняется на 360, я просто рекомендую

DirModel2 = mod(DirModel,360);
0 голосов
/ 21 февраля 2019

Вы можете свести все это к одной строке, используя логические индексы:

DirModel(DirModel<0) = DirModel(DirModel<0) + 360
0 голосов
/ 21 февраля 2019

Как насчет следующего кода?

>> DirModel = rand(2, 2, 29, 1739) - 0.5;
>> Neg = (DirModel < 0);
>> DirModel2 = DirModel;
>> DirModel2(Neg) = DirModel2(Neg) + 360;
>> DirModel(:, :, 1, 1)

ans =
     0.169128  -0.180931
     0.055867   0.339892

>> DirModel2(:, :, 1, 1)
ans =
      0.169128   359.819069
      0.055867     0.339892

Давайте проверим, что происходит:

>> Neg = (DirModel < 0);

Neg - логическая матрица 2 x 2 x 29 x 1739, в которой 1 указывают индексы, где DirModel имеет отрицательные значения.

>> DirModel2 = DirModel;

Это назначение обеспечивает копирование всех значений и сохранение размеров матрицы.

>> DirModel2(Neg) = DirModel2(Neg) + 360;

Только добавьте 360 к этим элементам матрицы, чье значение было отрицательным в исходном DirModel.

Ваше назначение

DirModel2=DirModel(Neg)+360

напрямую инициирует новую матрицу DirModel2 и обращается только к отрицательным значениям DirModel.Проверьте общее количество элементов вашего результата DirModel2!Поэтому у MATLAB нет причин сохранять размеры матрицы.

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