Изменить диапазон чисел матрицы

Форум, посвященный общим вопросам, связанным с MATLAB

Модератор: Admin

tur91
Пользователь
Сообщения: 142
Зарегистрирован: Пн май 05, 2008 4:22 pm

Изменить диапазон чисел матрицы

Сообщение tur91 » Ср окт 09, 2013 3:45 pm

Скажем дана матрица uint16 с 10-ти битными числами от 0 до 1023. Требуется умножить на 2 числа матрицы от 300 до 600. Остальные числа оставить без изменения. Как это сделать?
Как умножить тот же диапазон чисел на переменный коэффициент, меняющийся линейно от 2 при 300 до 1 при 600?

vvamy
Эксперт
Сообщения: 654
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Изменить диапазон чисел матрицы

Сообщение vvamy » Чт окт 10, 2013 9:43 am

[quote="tur91"]Скажем дана матрица uint16 с 10-ти битными числами от 0 до 1023. Требуется умножить на 2 числа матрицы от 300 до 600. Остальные числа оставить без изменения. Как это сделать?

A=uint16(round(1023*rand(5)));
B = A;
B(A>=300&A<600)=B(A>=300&A<600)*2

Виталий

tur91
Пользователь
Сообщения: 142
Зарегистрирован: Пн май 05, 2008 4:22 pm

Сообщение tur91 » Чт окт 10, 2013 12:27 pm

Виталий, спасибо.
А как же умножить на линию? На линейно переменный коэффициент.

vvamy
Эксперт
Сообщения: 654
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Сообщение vvamy » Чт окт 10, 2013 3:57 pm

tur91 писал(а):Виталий, спасибо.
А как же умножить на линию? На линейно переменный коэффициент.


Например, так:

N1 = 5;
N2 = 4;
A=uint16(round(1023*rand(N1, N2)));
B = A;
B(A>=300&A<600)=B(A>=300&A<600)*2;
C = A;
for k1 = 1 : N1
for k2 = 1 : N2
if A(k1, k2)>=300 & A(k1, k2)<600
k = 2-(1/300)*(double(A(k1, k2)) - 300);
C(k1, k2) = A(k1, k2)* k;
end
end
end

Виталий

letete
Пользователь
Сообщения: 110
Зарегистрирован: Вт сен 03, 2013 8:32 pm
Откуда: SPb

Сообщение letete » Чт окт 10, 2013 3:58 pm

дак так же!

A=uint16(round(1023*rand(5)));
B = A;
B(A>=300&A<600)=B(A>=300&A<600)*2;
C = A;
C(A>=300&A<600)=B(A>=300&A<600)*(2:-1/length(A(A>=300&A<600)):1);

или не про то речь?

tur91
Пользователь
Сообщения: 142
Зарегистрирован: Пн май 05, 2008 4:22 pm

Сообщение tur91 » Чт окт 10, 2013 6:16 pm

Виталий, спасибо, но мне нужно без for.
letete, я не понял что Вы написали, но я думаю как бы в этом же направлении.
Вот гистограмма матрицы
Изображение
я хочу диапазон от 380 до 680 преобразовать в диапазон от 380 до 1000.
Для этого вычисляем прямую на которую надо умножить исходный диапазон
Изображение
Тогда пик растянется и сместится вправо, займет диапазон от 380 до 1000.

letete
Пользователь
Сообщения: 110
Зарегистрирован: Вт сен 03, 2013 8:32 pm
Откуда: SPb

Сообщение letete » Чт окт 10, 2013 6:30 pm

tur91,
а я вообще ничего не понял))
если мы говорим об умножении в смысле .* (я кстати забыл точку поставить в прошлом посте), то какая вообще разница что на что умножать? Вам всего лишь нужно сотворить массив коэффициентов размером как A(A>300&A<600) , например для одномерного: (1:0.1:2), а для двумерного надо будет учитывать size( A(A>300&A<600) )...

tur91
Пользователь
Сообщения: 142
Зарегистрирован: Пн май 05, 2008 4:22 pm

Сообщение tur91 » Чт окт 10, 2013 11:20 pm

letete, в матрице М на каких то случайных местах стоят числа от 380 до 680, на остальных тоже неизвестных местах стоят числа из диапазонов от 0 до 380 и от 680 до 1023. Числа от 380 до 680 надо умножить на массив чисел. Создаем его х = 380:680; y = 2.07*x - 240;

Если записать матричное умножение так:

M(380 <= M & M <=680) = M(380 <= M & M <=680) .*y;

то получаем: Matrix dimensions must agree.

Так как его записать?

abobroff
Пользователь
Сообщения: 488
Зарегистрирован: Пн окт 25, 2010 1:21 pm

Сообщение abobroff » Пт окт 11, 2013 8:16 am

tur91 писал(а):letete, в матрице М на каких то случайных местах стоят числа от 380 до 680, на остальных тоже неизвестных местах стоят числа из диапазонов от 0 до 380 и от 680 до 1023. Числа от 380 до 680 надо умножить на массив чисел. Создаем его х = 380:680; y = 2.07*x - 240;

Если записать матричное умножение так:

M(380 <= M & M <=680) = M(380 <= M & M <=680) .*y;

то получаем: Matrix dimensions must agree.

Так как его записать?

Код: Выделить всё

y = @(x)2.07*x - 240;
l0=380 <= M & M <=680;
M(l0) = y(M(l0));

vvamy
Эксперт
Сообщения: 654
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Сообщение vvamy » Пт окт 11, 2013 9:30 am

tur91 писал(а):Виталий, спасибо, но мне нужно без for.


Вы об этом не сообщили. Без for вроде бы тоже можно:

N1N2 = input('N1, N2 = ?');
N1 = N1N2(1);
N2 = N1N2(2);
A=uint16(round(1023*rand(N1, N2)));
IA = A>=300&A<600;
D = A;
k = 2-(1/300)*(double(A(IA)) - 300);
D(IA) = double(A(IA)).*k;

Виталий.

tur91
Пользователь
Сообщения: 142
Зарегистрирован: Пн май 05, 2008 4:22 pm

Сообщение tur91 » Пт окт 11, 2013 10:54 am

Большое спасибо, abobroff и Виталий!

Теперь смогу дальше продвигаться.

tur91
Пользователь
Сообщения: 142
Зарегистрирован: Пн май 05, 2008 4:22 pm

Сообщение tur91 » Вт окт 15, 2013 5:59 pm

Еще одна задача на ту же тему.
Числа матрицы находятся в диапазоне от 0 до 1023
Есть массив коэффициентов coef = [1.021 1.022 1.025....] всего 1024 числа.
Нужно умножить все числа равные нулю на 1.021, все числа равные единице на 1.022, все числа равные 2 на 1.025 и т.д.

Как это сделать без for?

abobroff
Пользователь
Сообщения: 488
Зарегистрирован: Пн окт 25, 2010 1:21 pm

Сообщение abobroff » Вт окт 15, 2013 8:00 pm

A - массив с числами от 0 до 1023.

Код: Выделить всё

[~,~,ii] = unique(A);
out = A.*coef(ii);
или

Код: Выделить всё

[l,ii] = ismember(A,0:1023);
out = A.*coef(ii(l));

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Сообщение sandy » Вт окт 15, 2013 10:56 pm

Код: Выделить всё

out = A.*coef(A+1);
С уважением

Александр Сергиенко

tur91
Пользователь
Сообщения: 142
Зарегистрирован: Пн май 05, 2008 4:22 pm

Сообщение tur91 » Ср окт 16, 2013 1:47 pm

abobroff и Александр, спасибо большое.