Сравнение одного и того же числа между двумя матрицами разного размера - PullRequest
0 голосов
/ 13 ноября 2011

Я занимаюсь симуляцией, но не могу получить ответ, который хочу. Вот мой код:

req = [8 2 7; 2 4 5; 3 5 7];
time = [2 1 7; 3 4 6; 4 6 1];
max_time = max(max(time));
for i = 1 : 3
    timeline(:, i) = 1 : 1 : max_time;
    new(:, i) = setxor(timeline(:, i), time(:, i));
end
disp(timeline);
disp(new);
for i = 1 : 3
    for k = i : 4
        timeline(timeline(:, i) == new(k, i)) = 0;
    end
end
disp(timeline);

предположим, что ответ, который я должен получить, - это шкала времени, равная [0 1 1; 2 0 0; 3 0 0; 4 4 0; 0 0 0; 0 0 0; 0 6 6; 0 0 7]. Число на временной шкале, которое не равно новому, будет заменено на 0. Спасибо за помощь.

как насчет того, если время - трехмерный массив?

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

Не мой язык, так что я не могу сказать, но пока кто-то другой не отправит лучший ответ, я дам вам какое-то руководство. Попробуйте создать несколько упрощенных функций, которые ничего не делают, но принимают параметры и передают их любым функциям, которые они вызывают. Кажется, ваша проблема связана с сигнатурой ваших функций и тем, как вы пытаетесь их вызывать, и как только вы устраните все остальное, кроме этого, ответ, вероятно, выскочит на вас.

0 голосов
/ 13 ноября 2011

Если я правильно понял проблему, ее можно решить с помощью индексирования матрицы .Обратите внимание на следующее:

time = [2 1 7; 3 4 6; 4 6 1];                 %# row indices
c = repmat(1:size(time,2),size(time,1),1);    %# column indices

timeline = zeros(max(time(:)),size(time,2));  %# prepare result matrix
idx = sub2ind(size(timeline), time(:),c(:));  %# convert to linear indices
timeline(idx) = time;                         %# place the number in the matrix

Результат:

>> time
time =
     2     1     7
     3     4     6
     4     6     1

>> timeline
timeline =
     0     1     1
     2     0     0
     3     0     0
     4     4     0
     0     0     0
     0     6     6
     0     0     7

РЕДАКТИРОВАТЬ

Если time содержит ноль элементов, эти значения необходимо пропустить.Пример:

time = [2 1 7; 3 0 6; 0 0 1];
c = repmat(1:size(time,2),size(time,1),1);

ind = ( time(:)~=0 );                             %# non-zero entries

timeline = zeros(max(time(:)),size(time,2));
idx = sub2ind(size(timeline), time(ind),c(ind));  %# skip zero indices
timeline(idx) = time(ind);                        %# skip zero indices
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...