Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 04.06.2012
Сообщений: 13
1

Программа для расчета объемных весов

22.06.2012, 17:21. Показов 2241. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача: из указанного элемента матрицы двигаться вверх по строчкам, пока не будет достигнуто значение не равное 0. Перемножить его с соответствующим элементом массива D(y), далее
перейти в столбец равному этой строке и опять двигать вверх по строчкам. Цикл заканчивается на элементе первой строки не равном 0.
Весь смысл приложен в документе Word
Программа для расчета объемных весов

Изначальная иерархия классификации изделий.doc

Массив B(y) содержит номера последних таксонов.
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
for y=1:x;                           
    j=B(y);
    i=B(y);
    while i>=1;                        
        while M(i,j)==0;
            i=i-1;
        end
        D(y)=D(y)*M(i,j);
        F(i,y)=1;
        j=i;
    end
end

Выдает ошибку Attempted to access M(0,1); index must be a positive integer or logical.
По идее должно быть движение вверх по матрице к значениям M(1,2), M(1,3), M(1,4)
Как правильно это реализовать.
Я уже думаю, что вообще неправильные циклы сделал.
Миниатюры
Программа для расчета объемных весов  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2012, 17:21
Ответы с готовыми решениями:

Программа для расчета ЗП
Добрый день дорогие форумчане! Мне вот что интересно.есть ли программа в которой можно вести...

Программа для расчета по заданным размерам для шара, призмы, цилиндра.
Программа для вычета по заданным размерам для шара,призмы,цилиндра. И составить алгоритм к ней

Программа для расчета тока.
#include<iostream.h> #include<conio.h> #include<math.h> void main() { int k,d; float...

Программа для расчета по 2-м формулам
Напишите пожалуйста программу для расчета по 2-м формулам к этой картинке z_1=\frac{\sin 4\alpha...

10
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
22.06.2012, 17:53 2
У тебя похоже лажа с B(y), попробуй j=B(y)+1; и i=B(y)+1;
--
*.docx
ааа!11 мои глаза!
1
vetvet
22.06.2012, 19:00
  #3

Не по теме:

Цитата Сообщение от zosima Посмотреть сообщение
ааа!11 мои глаза!
Перезалила.

2
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
23.06.2012, 00:12 4
Цитата Сообщение от holdos Посмотреть сообщение
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
for y=1:x;                                            j=B(y);
    i=B(y);
  
    while i>=1    
        while M(i,j)==0;
            i=i-1;
        end
        D(y)=D(y)*M(i,j);
        F(i,y)=1;
        j=i;
    end
end
Похоже на правду, только это кусочек кода, нет присвоения x и B, чему они равны?
Хм, а если сделать так:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for y=1:x;                                             j=B(y);
    i=B(y);
  
    while i>=1
        i = find( M(:,j) ~= 0 ); % находим номер строки ненулевого элемента j-го столбца.
        % если ненулевой элемент один, то проблем возникнуть не должно
        % в противном случае придется брать нижний, т.е. с макс
имальным индексом
        % i = max( find( M(:,j) ~= 0 ) );
        % такая конструкция должна работать и при одном ненулевом элементе
       
 % поэтому можно использовать ее как более универсальную
        D(y)=D(y)*M(i,j);
        F(i,y)=1;
        j=i;
    end
end
--
vetvet, Вы оказывается девушка! Приятно, проникся симпатией. :shine:
2
1 / 1 / 0
Регистрация: 04.06.2012
Сообщений: 13
23.06.2012, 13:18  [ТС] 5
Теперь ошибка: Improper assignment with rectangular empty matrix.
Error in ==> raznoobrazie2 at 100
D(y)=D(y)*M(i,j);

x= количество цепочек. То есть количество посл. таксонов.
B(y)= массив с номерами последних таксонов.
M(i,j)- матрица, показывающая i- номер таксона, j- номера таксонов входящих непосредственно в таксон i
Согласно методу объемный вес цепочки = произведение объемных весов, входящих в нее таксонов.
Таксон- элемент классификации.

В каждом столбце по одному числу больше 0. Так как таксон может принадлежать только одному вышестоящему, как указано на рис. иерархии.!
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
23.06.2012, 14:06 6
D(y) = D(y).*M(i,j); точку перед умножением забыли :)
Кстати, если будешь использовать i = find( M(:,j)~=0 ); попробуй выше написать i = B(y); j = B(y); не прибавляя 1. Если будет ругаться на нулевой индекс - вернешь ее. Также вручную просчитай результат, чтобы можно было проверить правильность работы программы.
И доложи в сюда о результатах! :)
2
1 / 1 / 0
Регистрация: 04.06.2012
Сообщений: 13
23.06.2012, 14:23  [ТС] 7
Цитата Сообщение от zosima Посмотреть сообщение
D(y) = D(y).*M(i,j); точку перед умножением забыли
Кстати, если будешь использовать i = find( M(:,j)~=0 ); попробуй выше написать i = B(y); j = B(y); не прибавляя 1. Если будет ругаться на нулевой индекс - вернешь ее. Также вручную просчитай результат, чтобы можно было проверить правильность работы программы.
И доложи в сюда о результатах!
Точка перед умножением не спасла!
Если j=B(y)+1 - то будет уже неправильный столбец, что влияет на правильность расчетов.

Ошибка нулевого индекса после замены на i = find( M(:,j)~=0 ) уже не выходит.

Теперь
Matlab M
1
2
3
4
 ?? Improper assignment with rectangular empty matrix.
 
Error in ==> raznoobrazie2 at 101
        D(y)=D(y).*M(i,j);
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
23.06.2012, 14:31 8
Видать вектор D пустой, поставь в начале, перед for строку: D = ones(1,x); - создаем массив единичек длинной х. Думаю не нужно пояснять почему единичек, а не нулей?)
1
1 / 1 / 0
Регистрация: 04.06.2012
Сообщений: 13
23.06.2012, 14:35  [ТС] 9
Цитата Сообщение от zosima Посмотреть сообщение
Видать вектор D пустой, поставь в начале, перед for строку: D = ones(1,x); - создаем массив единичек длинной х. Думаю не нужно пояснять почему единичек, а не нулей?)

Это и так в тексте есть
Действительно пояснять не нужно

==
Прилагаю текст программы:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
[OFF]% clc;
disp('Пронумеруйте заданный граф сквозной нумерацией слева направо по уровням');
N=input('Введите общее количество таксонов ');
G=1;
T=zeros(1,N);
i=N;
j=N;
M=zeros(i,j);
V=zeros(1,j);
E=zeros(1,j);
V(1)=1;
 
for k=2:N;
     V(k)=input(['Введите объёмный вес ', num2str(k),'-го таксона: ']);
end
 
for n=1:N;
     T(n)=input(['Введите количество таксонов, входящих в таксон  ', num2str(n), ' ']);
end
 
if T(1)==0;
    error('ОШИБКА! T(1) не должно быть равно 0.'); 
end
 
if sum(T)~=N-1;
    
   error('Ошибка! Общее количество таксонов не совпадает с введенным количеством таксонов');
end
 
m=2;
for i=1:N;
    G=G+T(i);
    for j=m:G;
        M(i,j)=V(j);
    end
    if T(i)~=0;
    m=G+1;
    end
end
 
for i=1:N                        
    for j=1:N
        E(i)=E(i)+M(i,j);
    end
end
for i=1:N;
    if E(i)~=1 && E(i)~=0;
        error('Объёмные веса таксонов заданы не правильно');
    end
end
 
y=0;                     
for n=1:N;                               %РАСЧЁТ КОЛИЧЕСТВА ПОСЛЕДНИХ ТАКСОНОВ ( КОЛИЧЕСТВА ЦЕПОЧЕК)
    if T(n)==0;
        y=y+1;
    end
end
 
p=N;
B=zeros(1,y);
F=zeros(p,y);
x=y;
l=y;
y=1;
 
for n=1:N;                             %ЗАПИСЬ НОМЕРОВ ПОСЛЕДНИХ ТАКСОНОВ В МАССИВ B(y)
    if T(n)==0;
       while B(y)~=0;
           y=y+1;
       end
       B(y)=n;
    end
end
 
 
D=ones(1,l);                          % ЗАПИСЬ В МАССИВ ОБЪЕМНЫХ ВЕСОВ ЦЕПОЧЕК ЗНАЧЕНИЯ ПЕРВЫХ ТАКСОНОВ
for b=1:y;         
    l=b;
    c=B(b);
    D(l)=V(c);
end
 
%===========================          %ЗАПИСЬ  В МАТРИЦУ СТРУКТУРНЫХ
%ЦЕПОЧЕК НОМЕРА ПОСЛЕДНИХ ТАКСОНОВ
for y=1:x;
    j=B(y);
    F(j,y)=1;
end
 
%===========================
 
 
 
 
for y=1:x;                                         
    j=B(y);
    i=B(y)+1;
  
    while i>=1
        i = find( M(:,j) ~= 0 ); % находим номер строки ненулевого элемента j-го столбца.
        D(y)=D(y).*M(i,j);
        F(i,y)=1;
        j=i;
    end
end
 
 
%============================
 
S=zeros(1,x);                       % РАСЧЕТ СТРУКТУРНЫХ ВЕСОВ ЦЕПОЧЕК
for y=1:x;
    S(y)=D(y)*log(D(y));
end
 
%===========================
 
 
for y=1:x;                        % ЗАПОЛНЕНИЕ МАТРИЦЫ F(p,N) СООТВЕТСТВУЮЩИМИ СТРУКТУРНЫМИ ВЕСАМИ
    for j=1:N;
        if F(j,y)~=0;
            F(j,y)=S(y);
        end
    end
end
 
H=zeros(N);
 
for j=1:N;                             % РАСЧЕТ ЭНТРОПИИ
    for y=1:x;
        H(j)=H(j)+F(j:y);
    end
end
 
 
z=input('Введите количество систем таксонов ');                   %ВВОД СИСТЕМ
Q=zeros(1,N);
r=zeros(1,z);
 
for  q=1:z; 
    Q(q)=input(['Введите  массив с номерами таксонов ' , num2str(q),'-ой системы']);
    qq=length(Q);
    R=zeros(1,qq);
    
    for a=1:qq;
        
        if Q(q)~=0;
           b=Q(q);
           Q(q)=H(b);
        end
        
    end
    EH=sum(Q);
    r(q)=EH/H(1);
end
    
disp(r)[/OFF]
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
23.06.2012, 16:13 10
Да, непросто разобраться в такой программе без матлаба через телефон.
Неплохо было бы поставить breakpoint напротив строки D(y) = D(y).*M(i,j); чтобы проконтролировать значения D, M, i, j, y и понять где там берется пустой элемент.
Надеюсь народ подтянется.
-
И исправь i = B(y)+1; на i = B(y);
2
1 / 1 / 0
Регистрация: 04.06.2012
Сообщений: 13
24.06.2012, 14:15  [ТС] 11
За ночь придумал как все по другому сделать. Все работает.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
disp('Пронумеруйте заданный граф сквозной нумерацией слева направо по уровням');
N=input('Введите общее количество таксонов ');
 
V=zeros(1,N);
 
V(1)=1;
 
for k=2:N;
     V(k)=input(['Введите объёмный вес ', num2str(k),'-го таксона: ']);
end
 
M=input('Введите общее количество цепочек ');
 
A=zeros(N,M);
D=ones(1,M);
St=zeros(1,M);
H=zeros(1,N);
 
% ЗАПОЛНЕНИЕ МАТРИЦЫ
 
for k=1:M;
S=input(['Введите номера таксонов, входящих в ' , num2str(k), '-ую цепочку ']);
 kmax=length(S);
    for l=1:kmax
        if S(l)~=0
            i=S(l);
            A(i,k)=1;
        end
    end
end
 
%ЗАПОЛНЕНИЕ МАТРИЦЫ ОБЪЕМНЫМИ ВЕСАМИ
 
for k=1:N;
    for l=1:M;
        if A(k,l)~=0;
            A(k,l)=V(k);
        end
    end
end
 
%РАСЧЕТ ОБЪЕМНЫХ ВЕСОВ ДЛЯ КАЖДОЙ ЦЕПОЧКИ
 
for k=1:M;
    for l=1:N;
      if A(l,k)~=0;
          D(k)=D(k)*A(l,k);
      end
    end
end
 
 % РАСЧЕТ СТРУКТУРНЫХ ВЕСОВ ЦЕПОЧЕК
 
                      
for k=1:M;
    S(k)=-D(k)*log(D(k));
end
 
%ЗАПОЛНЕНИЕ МАТРИЦЫ СООТВЕТСТВУЮЩИМИ СТРУКТУРНЫМИ ВЕСАМИ
 
for k=1:M;
    for l=1:N;
        if A(l,k)~=0;
            A(l,k)=S(k);
        end
    end
end
 
%РАСЧЕТ СТРУКТУРНЫХ ВЕСОВ ТАКСОНОВ
 
for k=1:N;
    for l=1:M;
        H(k)=H(k)+A(k,l);
    end
end
 
z=input('Введите количество рассматриваемых систем ');
B=zeros(z,N);
r=zeros(1,z);
for k =1:z;
    Q=input(['Введите номера таксонов, входящих в систему ', num2str(k), ' ']);
    kmax=length(Q);
   for l=1:kmax
        if Q(l)~=0
            m=Q(l);
            B(k,m)=1;
        end
   end
end
 
for k=1:N;
    for l=1:z;
        if  B(l,k)~=0;
            B(l,k)=H(k);
        end
    end
end
 
for k=1:z;
    for l=1:N;
        r(k)=r(k)+B(k,l);
    end
end
 
r=r./H(1);
 
disp(r);
1
24.06.2012, 14:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2012, 14:15
Помогаю со студенческими работами здесь

Программа для расчета параметров
Доброго всем дня суток! Помогите пожалуйста не могу сам никак разобраться В общем, у меня есть...

Программа для расчета по формулам
программа для расчета по формулам

Программа для расчета радиостанций
День добрый. Помогите написать программу для учета 3х радиостанций и человека стоящего в центре. На...

Программа для расчета MD5
Привет. Есть программа, которая считает сумму md5 файла. Я выложу .pas файл, если ком то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru