2017-09-14 1 views
1

J'essaye d'effectuer un calcul en utilisant deux matrices différentes, mais elles sont apparues sous des formes légèrement différentes. La matrice unique (par intérêt) est remplie avec des valeurs de réflectance d'un matériau de longueurs d'onde de 200 nm à 2600 nm, de sorte que chaque longueur d'onde individuelle, par incréments de 1 a une valeur de réflectance.Remplir les espaces vides de la matrice qui a des pas irréguliers

La deuxième matrice est une matrice d'énergie solaire qui stocke la quantité d'énergie présente à chaque longueur d'onde. Celui-ci a cependant des pas irréguliers et varie de 280 nm à 4000 nm. Mais de 280nm-400nm il est dans les étapes de 0.5nm, de 400nm-1705nm il est dans les étapes de 1nm, et de 1750nm-4000nm il est des étapes de 5nm. Ce que j'essayais de faire sans le savoir jusqu'ici, c'est d'éditer cette matrice d'énergie solaire de sorte qu'elle donne toute la gamme par pas de 1 nm.

filename='H:\I_sol data.csv'; 
Dataisol = csvread(filename,1,0); 

for j=1:1:count 
    if Dataisol(j,:)~=Dataisol(j+1,:)-1 %compare the wavelength to the value of the next wavelegth 
     newx=(Dataisol(j,:)+[1,0])  %if the next wavelength is not 1 larger than the previous, add a new row 
     newx(1,2)=NaN     %make the new row to add blank 
     Dataisol=insertrows(Dataisol, newrow, j+1) %insert the new blank row 
    end 
end 

ci-dessus est ce que j'ai commencé avec, en ce moment je suis juste essayer de combler les lacunes en ajoutant de nouvelles lignes où il y a un saut de 5 nm entre les longueurs d'onde. Une fois que je suis capable de créer les éléments manquants, je vais m'occuper de les peupler avec les valeurs correctes (probablement le point milieu entre les 2 valeurs données)

Mon objectif final sera d'équilibrer les deux matrices de sorte qu'ils ont tous les deux la même longueur d'onde de début et de fin et les deux ont des incréments de 1nm partout (aussi pour l'intérêt de l'intérêt, ou pour des conseils si cela est trivial pour quelqu'un). Si quelqu'un sait comment combler ces lacunes ou apporter les modifications nécessaires à la matrice, ce serait une aide précieuse!

Exemple du fichier csv:

Wvlgth nm Etr W*m-2*nm-1 
280.0 8.2000E-02 
280.5 9.9000E-02 
281.0 1.5000E-01 
281.5 2.1200E-01 
282.0 2.6700E-01 
282.5 3.0300E-01 
283.0 3.2500E-01 
283.5 3.2300E-01 
284.0 2.9900E-01 
284.5 2.5024E-01 
285.0 1.7589E-01 
285.5 1.5500E-01 
286.0 2.4200E-01 
...  ..... 
428.0 1.6510E+00 
429.0 1.5230E+00 
430.0 1.2120E+00 
431.0 1.0990E+00 
432.0 1.8220E+00 
433.0 1.6913E+00 
434.0 1.5600E+00 
435.0 1.7090E+00 
436.0 1.8680E+00 
437.0 1.9000E+00 
438.0 1.6630E+00 
439.0 1.6010E+00 
440.0 1.8300E+00 
.... ..... 
2205.0 8.0900E-02 
2210.0 8.0810E-02 
2215.0 8.0410E-02 
2220.0 7.9990E-02 
2225.0 7.8840E-02 
2230.0 7.8400E-02 
2235.0 7.7930E-02 
2240.0 7.6510E-02 
2245.0 7.6250E-02 
2250.0 7.5370E-02 
...  ..... 

Voici le code que j'utilise pour assigner les variables à utiliser dans la fonction interp1, qui est appelé comme suit:

solx=Dataisol(:,1); 
soly=Dataisol(:,2); 
xi=280:1:2600; 
newsol = [xi interp1(solx,soly,xi,'linear','extrap')]; 

Les valeurs qui sont stockées dans ces variables ainsi que l'erreur que je reçois sont indiquées ci-dessous:

enter image description here

Répondre

2

La fonction dont vous avez besoin ici est interp1. Définissez xi comme vecteur de toutes les longueurs d'onde que vous souhaitez prendre en compte, par exemple xi=280:1:2600;.

si wavelength est un vecteur de toutes vos valeurs irrégulières du fichier, et sol est le vecteur correspondant de toutes les énergies solaires (vous pouvez utiliser des références de colonne pour votre seule matrice ici aussi)

newsol = [xi interp1(wavelength,sol,xi,'linear','extrap')];

vous donnera une nouvelle matrice avec des longueurs d'onde augmentant de 1 dans la colonne 1, et la colonne 2 contiendra des valeurs directement à partir de votre fichier où elles existent et des valeurs interpolées linéairement où elles ne le sont pas.

+0

est-ce que la ligne avec "newsol = ..." devrait être insérée seule ou dans la boucle for? J'ai essayé de l'implémenter, mais recevez l'erreur suivante: (Erreur lors de l'utilisation de griddedInterpolant.Les vecteurs de la grille doivent contenir des points uniques) –

+0

Aucune boucle requise – etmuse

+0

Je ne semble toujours pas être en mesure de le faire fonctionner, j'ai ajouté quelques informations supplémentaires qui montrent à quoi ressemblent mes variables, ainsi que l'erreur que j'obtiens –