Почему функция прибоя MATLAB не работает с данными с одинарной точностью? - PullRequest
4 голосов
/ 07 марта 2012

У меня есть матрица значений типа single, которую я хочу построить на поверхности. Когда я пытаюсь использовать функцию прибоя в MATLAB, я получаю сообщение об ошибке, указывающее, что мне нужно использовать вместо uint8 или double:

x=peaks; %# Initialize x to a matrix of doubles
surf(x); %# No problem when x is of type double

Сейчас попробую синглы:

x=single(peaks);
surf(x); 

выдает следующую ошибку:

Warning: CData must be double or uint8. 
Warning: CData must be double or uint8. 

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

x=single(peaks);
surf(x,double(x));

Работает просто отлично. Но просто для удовольствия давайте попробуем и uint8:

x=single(peaks);
surf(x,uint8(x));

Получает следующее:

Warning: CData must be double or single unless it is used only as a texture data 
Warning: CData must be double or single unless it is used only as a texture data 

Какого черта MATLAB? Прими решение! Так почему же мне нужно использовать дополнительную память в форме двойной точности для обозначения карты цветов для функции surf? Даже когда в тексте ошибки MATLAB говорится, что я могу использовать uint8 или single, в зависимости от того, какой из них я не использовал ?

1 Ответ

1 голос
/ 07 марта 2012

люблю вопрос.

Не уверен, видели ли вы это или нет, но это, по крайней мере, устраняет ваше же отвращение. Похоже, что Майкл был разочарован производительностью алгоритма uint8, поскольку он описывает, что он, похоже, создает для себя более вычислительную работу с сюжетом, который не отвечает его эстетическим потребностям. Я попробовал это с примером peaks, и вот что я получаю:

Raw Peaks Data

Затем я добавил смещение, чтобы получить весь сюжет.

Offset Peaks Data

Эх, хорошо, наверное. Вот код, надеюсь, это было полезно.

% Test code from Matlab Central
a=256*rand(5);
b=uint8(a);
figure;
surf(b,'facecolor','texturemap')

% get the example peaks data
% and plot without any scaling
x = peaks;
figure;
surf(uint8(x),'facecolor','texturemap')

% get the offset to keep all the data positive
% not pretty but functional
xp = x-min(min(x))+1;
figure;
surf(uint8(xp),'facecolor','texturemap')
...