Функция movstd меняет местами размеры выходной матрицы?

Я заметил, что функция movstd меняет размеры моей матрицы.

Мои входные данные — это матрица 3x5x100, а выходные — матрица 5x100x3. Я тестировал 3D-матрицы меньшего размера (2x3x5), и все работает нормально. Я что-то пропустил в документации?

Вот мой код:

clear; close all; clc;

xlist = 1:5;
ylist = (1:3)*10;

% Making a LUT from x and y : LUT --> nConf | x | y
count = 1;
for kx=1:length(xlist)
 for ky=1:length(ylist)
   LUT(count,:) = [count xlist(kx) ylist(ky)];
   count = count+1;
   end
end

% Making the data --> nConf | measurement
% data :  1 x1
%         2 x2
%        ...
%        15 x15
%         1 x16
%         2 x17
%        ...
Nrounds = 100;
data = zeros(Nrounds*length(LUT),2); % Let's have a multiple rounds/cycles measurements
data(:,2) = rand(length(data),1); % Random measurements
data(1:floor(Nrounds)*length(LUT),1) = repmat(LUT(:,1),[floor(Nrounds) 1]); % Fill the nConf column

% Parameter to compute a noise approximation
wlen = 3; % window length
opt = 0; %see movstd doc

%% Reshaping the data in a 3D matrix with each column in the third axis is a conf with Nrounds layers
Mdata_rs = reshape(data(:,2),[length(ylist) length(xlist) Nrounds]);
movSTDdata_rs = movstd(Mdata_rs,wlen,opt,3);
output1 = median(movSTDdata_rs,3); %Get a noise approximation ignoring the possible base line

Я запустил его с помощью Matlab, и проблем нет. Я знаю, что могу обойти это, используя Mdata_rs, чтобы получить правильный порядок, но мне хотелось бы знать, почему или хотя бы когда появляется такое поведение.

Итак, вот причина, по которой у вас возникла эта проблема: stackoverflow.com/q/78677682/7328782 — Это похоже на ошибку, вам следует открыть заявку в трекере ошибок Octave.

Cris Luengo 27.06.2024 16:17

@CrisLuengo Ну и да, и нет. Я работал над одним и тем же кодом, но это две отдельные проблемы с разным поведением и последствиями.

Adrien M 27.06.2024 17:33

Что ж, это прекрасно объясняет, почему этот код дает разные ответы в MATLAB и Octave. Кроме того, если код Octave не работает из-за замены измерений, возможно, он делает что-то еще неправильно.

Cris Luengo 27.06.2024 17:38

Обратите внимание, что movSTDdata_rs = reshape(movSTDdata_rs,[length(ylist) length(xlist) Nrounds]); в вашем связанном коде не решает проблему перепутанных размеров. reshape не меняет размеры. Вы можете проверить, используете ли вы Octave, и использовать permute, чтобы упорядочить размеры, как в результате MATLAB.

Cris Luengo 27.06.2024 17:42

@CrisLuengo Ты прав. В общем-то это не сработает, но в моем случае получается :-)

Adrien M 27.06.2024 18:59

Нет, в вашем случае это тоже не работает. Вы думаете, что да, но это не так. Если бы это сработало, вы, вероятно, не получили бы разных результатов в MATLAB и Octave.

Cris Luengo 27.06.2024 21:22

похоже, это влияет на все функции movX. вы можете просто сделать: a = rand(3,6,4); movmean(a,3,1), movmean(a,3,2), movmean(a,3,3) чтобы увидеть, что когда dim равен 3, форма возврата неверна. Я думаю, что эти функции выполняют внутреннюю перестановку, чтобы всегда перемещать рабочее измерение в одно и то же измерение с перестановкой в ​​конце. наверное там что-то не так. следует подать отчет на bugs.octave.org

Nick J 28.06.2024 05:48

@NickJ Да, movfun меняет тусклое значение на первое, а затем возвращает его обратно. Однако я не мог понять, правильно это было сделано или нет. Дело в том, что, похоже, это не всегда так.

Adrien M 28.06.2024 09:33

отправлен отчет об ошибке

Nick J 28.06.2024 17:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, что в movefun (вызываемом movstd, movmean и т. д.) в Octave 9.2.0 есть ошибка. Функция изменяет форму/перестановку входных данных, выравнивая их до 2D, и помещает рабочее измерение в столбцы для упрощения кодирования оконных операций. Функция завершается восстановлением формы, сначала путем ее разглаживания с помощью reshape, а затем путем изменения тусклой перестановки. К сожалению, похоже, что в коде следовало использовать ipermute, а не permute, и эта проблема возникала только при работе с dim > 2, и не было никаких самопроверок для данных nD, чтобы выявить эту проблему.

Отчет об ошибке был открыт по адресу https://savannah.gnu.org/bugs/index.php?65927

Надеемся, это будет исправлено до версии 9.3.0. Между тем, похоже, что правильную функциональность вашего кода можно восстановить, изменив строку 297 с:

y = permute (y, [dperm, nd+1]);

к

y = ipermute (y, [dperm, nd+1]);

ОБНОВЛЕНИЕ: Для исправления этой ошибки был отправлен патч. Он должен быть доступен как часть Octave 9.3.0. Если тем временем требуется исправление, односимвольное исправление, указанное выше, можно внести в файл movfun.m в версии 9.2.0 (набрав edit movfun в Octave).

Другие вопросы по теме