Циклы в программе Matlab - PullRequest
       9

Циклы в программе Matlab

0 голосов
/ 09 апреля 2010

У меня есть 3 набора по 10 векторов в каждом, и я хочу взять 2 вектора из первого набора, 2 вектора из второго набора и 3 вектора из третьего набора. Моя цель - сделать цикл для реализации следующей программы, зная, что после каждого вычисления результат должен сохраняться в новом файле.
Моя проблема в том, что я не могу обработать индексы, включенные в строки. Я пытаюсь использовать несколько циклов для сканирования 3 комплектов в порядке индексов. Циклы должны содержать следующую программу

clc;  
clear all;  

load('C:\Users\Documents\MATLAB\myFile\matrice_F.mat');  
load('C:\Users\Documents\MATLAB\myFile\matrice_G.mat');  

F = m_F;  
G = m_G;  


load('C:\Users\Documents\MATLAB\myFile\matrice_J.mat');  
load('C:\Users\Documents\MATLAB\myFile\matrice_K.mat');  

J = m_J;  
K = m_K;  

load('C:\Users\Documents\MATLAB\myFile\matrice_N.mat');  
load('C:\Users\Documents\MATLAB\myFile\matrice_O.mat');  
load('C:\Users\Documents\MATLAB\myFile\matrice_P.mat');    
N = m_N ;  
O = m_O;  
P = m_P;  

[A,B,C,D,E] = myFun(F,G,J,K,N,O,P);  

file_name = 'matrice_final.mat';  
save(file_name,'A','B','C','D','E');   

Благодарю всех, кто ответил на мой вопрос. Извините, если я не был так точен с самого начала. Однако хотелось бы, чтобы программа выглядела примерно так:

clc; 


    clear all;    

    set1={F,G,FF,GG,X,Y,XX,L,BH,JK};  %set of name vectors  
    set2={J,K,HG,UY,TR,BC,XW,IOP,ES,QA};  %set of name vectors  
    set3={AJ,RK,DS,TU,WS,ZZE,ZXW,TYP,ZAA,QWW};  %set of name vectors  

for i=1:1:9    

        load('C:\Users\Documents\MATLAB\myFile\matrice_'set1(i)'.mat');    
        load('C:\Users\Documents\MATLAB\myFile\matrice_'set1(i+1)'.mat');   

        'set1(i)' = m_'set1(i)';     
        'set1(i+1)' = m_'set1(i+1)';     

    for j=1:1:9   

        load('C:\Users\Documents\MATLAB\myFile\matrice_'set2(j)'.mat');     
        load('C:\Users\Documents\MATLAB\myFile\matrice_'set2(j+1)'.mat');  

        'set2(j)' = m_'set2(j)';     
        'set2(j+1)' = m_'set2(j+1)';   

        for k=1:1:8   

            load('C:\Users\Documents\MATLAB\myFile\matrice_'set3(k)'.mat');       
            load('C:\Users\Documents\MATLAB\myFile\matrice_'set3(k+1)'.mat');      
            load('C:\Users\Documents\MATLAB\myFile\matrice_'set3(k+2)'.mat');        

            'set3(k)' = m_'set3(k)' ;      
            'set3(k+1)' = m_'set3(k+1)';     
            'set3(k+2)' = m_'set3(k+2)';      

    [Result1'index',Result2'index',Result3'index',Result4'index',Result5'index'] = myFun('set1(i)','set1(i+1)','set2(j)','set2(j+1)','set3(k)','set3(k+1)','set3(k+2)');  %% 9x9x8=648   index=1,2,...,648      

    file_name = 'matrice_final'index'.mat';      
    save(file_name,'Result1'index'','Result2'index'','Result3'index'','Result4'index'','Result5'index'');        
        clear 'set3(k)' 'set3(k+1)' 'set3(k+2)'   
        end   
    clear 'set2(j)' 'set2(j+1)'   
    end   
    clear 'set1(i)' 'set1(i+1)'
end

Ответы [ 3 ]

2 голосов
/ 09 апреля 2010

Примечание: обновлено с учетом новых требований в вопросе ...

Вот решение, в котором не используется EVAL :

clc;
clear all;

set1 = {'F','G','FF','GG','X','Y','XX','L','BH','JK'};
set2 = {'J','K','HG','UY','TR','BC','XW','IOP','ES','QA'};
set3 = {'AJ','RK','DS','TU','WS','ZZE','ZXW','TYP','ZAA','QWW'};

matrices = cell(1,7);  %# An empty cell array
fileString = 'C:\Users\Documents\MATLAB\myFile\matrice_';  %# First part of
                                                           %#   file name

for i = 1:9  %# Loop over set1

  fileData = load([fileString set1{i} '.mat']);  %# Load file
  matrices{1} = fileData.(['m_' set1{i}]);       %# Get matrix

  fileData = load([fileString set1{i+1)} '.mat']);  %# Load file
  matrices{2} = fileData.(['m_' set1{i+1}]);        %# Get matrix

  for j = 1:9  %# Loop over set2

    fileData = load([fileString set2{j} '.mat']);  %# Load file
    matrices{3} = fileData.(['m_' set2{j}]);       %# Get matrix

    fileData = load([fileString set2{j+1)} '.mat']);  %# Load file
    matrices{4} = fileData.(['m_' set2{j+1}]);        %# Get matrix

    for k = 1:8  %# Loop over set3

      fileData = load([fileString set3{k} '.mat']);  %# Load file
      matrices{5} = fileData.(['m_' set3{k}]);       %# Get matrix

      fileData = load([fileString set3{k+1} '.mat']);  %# Load file
      matrices{6} = fileData.(['m_' set3{k+1}]);       %# Get matrix

      fileData = load([fileString set3{k+2} '.mat']);  %# Load file
      matrices{7} = fileData.(['m_' set3{k+2}]);       %# Get matrix

      [A,B,C,D,E] = myFun(matrices{:});  %# Pass matrices to your function

      index = k+8*(j-1)+72*(i-1);        %# Combination index
      fileName = ['matrice_final' int2str(index) '.mat'];  %# Save file name
      save(fileName,'A','B','C','D','E');                  %# Save the data

    end
  end
end

Я сделал одну небольшую модификацию.Вместо сохранения от A1 до E1 в файле matrice_final1.mat и от A2 до E2 в файле matrice_final2.mat и т. Д., Я просто сохранил A до E в каждом файле, так как файлсамо имя уже указывает на индекс.Если вы хотите загрузить несколько файлов одновременно без переписывания матриц A - E, вы можете сделать следующее:

data1 = load('matrice_final1.mat');  %# Load data into structure data1
data2 = load('matrice_final2.mat');  %# Load data into structure data2

Теперь data1.A даст вам A дляиндекс 1, и data2.A даст вам A для индекса 2.

0 голосов
/ 09 апреля 2010

Хорошо, я думаю, что понял. У вас возникли проблемы со ссылкой на загрузку матрицы из файла mat. Вы знаете название матрицы из файла .mat, но как вы относитесь к нему в matlab?

Вам нужно использовать eval

Вам нужно будет сделать что-то вроде:

  1. Прочитать букву в имени файла и сохранить его в переменной letter
  2. Загрузить матрицу
  3. Звоните loaded_array = eval(['m_', letter]);
0 голосов
/ 09 апреля 2010

Обновление:

ОК, значит, ваша программа выглядит хорошо, но у вас есть несколько основных ошибок:

Конкатенация строк:

load('C:\Users\Documents\MATLAB\myFile\matrice_'set1(i)'.mat');

Таким образом, строка, которую вы передаете load, на самом деле не является строкой, пока вы не объедините ее. Например, ['Hello' ' ' 'World'] будет строкой Hello World. Вам нужно заключить его в [ и ].

Поэтому измените операторы load на:

load(['C:\Users\Documents\MATLAB\myFile\matrice_' set1(i) '.mat']);

Неправильное использование eval

Чтобы eval работал, вам нужно создать строку (которая является командой) и передать ее в eval. Следующее не будет работать:

'set1(i)' = m_'set1(i)';

Но это будет работать:

eval([ set1(i) ' = m_' set1(i) ';']);

Так как это эквивалент (если i = 1);

A = m_A;

Использование index

Я не понял роль переменной index.

clear

clear может использоваться со строковым аргументом так:

clear 'set2(j)' 'set2(j+1)' 

Должен быть изменен на:

clear(set2(j),set2(j+1));

Старый ответ: Вам нужно eval. Я думаю, что это не рекомендуется, но, кажется, это путь для вас.

%%// Cleanup
clc;  
clear all;  

%%// The loop
matrices = 'FGJKNOP';
for i = 1:numel(matrices)
    load_string = ['load(''C:\Users\Documents\MATLAB\myFile\matrice_' matrices(i) '.mat'');'];
    eval(load_string); %// Example: load('C:\Users\Documents\MATLAB\myFile\matrice_F.mat'); 
    eval([matrices(i) ' = m_' matrices(i) ';']); %// Example: F = m_F;  

end

%%// Saving the data
results = 'ABCDE';
%// Make the string [A,B,C,D,E]
results_string = sprintf('%c,',results);
results_string = ['[' results_string(1:end-1) ']'];
%// Make the string (F,G,J,K,N,O,P)
matrices_args = sprintf('%c,',matrices);
matrices_args = ['(' matrices_args(1:end-1) ');'];    
%// Make the string ,'A','B','C','D','E' etc.
results_args = sprintf(',''%c''',results);

%// Save the data
eval([results_string ' = myFun' matrices_args]);
file_name = 'matrice_final.mat';
eval(['save(file_name' results_args ');']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...