2014-09-18 6 views
1

У меня есть проблема с MATLAB bar3 участков: Вот что у меня есть:Matlab bar3 участок


м х п Массив Values, содержащий значения измерения.

Другой м х п Массив Angles Представляет угол, при котором измеряют значение (например, 3-е значение было измерено под углом 90 °). Угловые значения для каждого измеренного значения сохраняются в другой переменной.


Мне нужен диапазон для моей оси х от -180 ° до + 180 °. Это само по себе не проблема. Но как мне передать свои измерения? Я должен как-то связать их с угловыми значениями. Так что каждое значение в Values каким-то образом связано с его угловым значением в Angles. Для моей оси y я могу просто подсчитать от 0 до количества строк моего массива Values.

Пример:

Values выглядит следующим образом:

3 5 6 
2 1 7 
5 8 2 

Angles выглядит следующим образом:

37° 38° 39° 
36° 37° 38° 
34° 35° 36° 

Values(1,1) = 3 измеряли при Angles(1,1) = 37°, например.

+0

Так что должно быть график? Два стержня укладываются вдоль оси y при x = 37, один на 34 и т. Д.? –

+0

Sry, я ошибся! Вы правы с этим! http://www.mathworks.com/matlabcentral/fileexchange/screenshots/2842/original.jpg На оси х есть углы. На оси Y - идентификатор измерения. А по оси z построено само значение. Поэтому в моем примере мы имели бы и ось х от 34 до 39 °, ось у от 1 до 3 и 9 баров в соответствии с девятью значениями. – PKlumpp

+0

Значит, количество баров при каждом значении x может варьироваться, правильно? Один бар при x = 34, два бара при x = 37 и т. Д. –

ответ

3

При каждом угле количество баров варьируется в зависимости от того, сколько измерений существует для этого угла. bar3 нуждается в матричном вводе. Чтобы построить матрицу, пропущенные значения заполняются NaN.

Предупреждение: NaN s обычно игнорируются при построении команд, но bar3, по-видимому, нарушает это соглашение. Кажется, он заменил NaN s на нули! Поэтому при отсутствующих значениях вы получите балл с нулевой высотой (вместо бара вообще).

[uAngles, ~, uAngleLabels] = unique(Angles); %// get unique values and 
    %// corresponding labels 
valuesPerAngle = accumarray(uAngleLabels(:), Values(:), [], @(v) {v}); 
    %// cell array where each cell contains all values corresponding to an angle 
N = max(cellfun(@numel, valuesPerAngle)); 
valuesPerAngle = cellfun(@(c) {[c; NaN(N-numel(c),1)]}, valuesPerAngle); 
    %// fill with NaNs to make all cells of equal lenght, so that they can be 
    %// concatenated into a matrix 
valuesPerAngle = cat(2, valuesPerAngle{:}); %// matrix of values for each angle, 
    %// filled with NaNs where needed 
bar3(uAngles, valuesPerAngle.'); %'// finally, the matrix can be plotted 
ylabel('Angles') 
xlabel('Measurement') 

С вашим примером Values и Angles это дает:

enter image description here

+0

Есть проблема. 'NaN' не игнорируются 'bar3'! Вместо этого они дают 0. См. Edit –

+0

Это не проблема atm, так как значения 0 не могут быть измерены.поэтому ясно, что эти значения не представляют собой что-то полезное – PKlumpp

+1

Если это проблема (в более общей настройке), [этот подход] (http://stackoverflow.com/q/24269516/2586922), вероятно, можно было бы адаптировать к удалите эти стержни –

Смежные вопросы