Wykres 3D, przerobienie danych z Excel do Mathematica
- bolo
- Użytkownik
- Posty: 2470
- Rejestracja: 2 lis 2004, o 08:28
- Płeć: Mężczyzna
- Lokalizacja: BW
- Podziękował: 8 razy
- Pomógł: 191 razy
Wykres 3D, przerobienie danych z Excel do Mathematica
Witam,
Opisując krótko problem, mam w Excelu dane do wykresu 3D w postaci następującej tabeli:
\(\displaystyle{ \begin{tabular}{l|lllll}
& y_{1} & y_{2} & y_{3} & \ldots & y_{100} \\ \hline
x_{1} & f(x_{1},y_{1}) & f(x_{1},y_{2}) & f(x_{1},y_{3}) & \ldots & f(x_{1},y_{100}) \\
x_{2} & f(x_{2},y_{1}) & f(x_{2},y_{2}) & f(x_{2},y_{3}) & \ldots & f(x_{2},y_{100}) \\
x_{3} & f(x_{3},y_{1}) & f(x_{3},y_{2}) & f(x_{3},y_{3}) & \ldots & f(x_{3},y_{100}) \\
\vdots & \vdots & \vdots & \vdots & & \vdots \\
x_{100} & f(x_{100},y_{1}) & f(x_{100},y_{2}) & f(x_{100},y_{3}) & \ldots & f(x_{100},y_{100}) \\
\end{tabular}}\)
i chciałbym to masowo przekształcić do postaci akceptowanej przez funkcję Plot3D w Mathematica:
\(\displaystyle{ \{x_{1},y_{1},f(x_{1},y_{1})\},\{x_{2},y_{1},f(x_{2},y_{1})\},\{x_{3},y_{1},f(x_{3},y_{1})\},\dots,\\\{x_{1},y_{2},f(x_{1},y_{2})\},\{x_{2},y_{2},f(x_{2},y_{2})\},\{x_{3},y_{2},f(x_{3},y_{2})\},\dots}\)
Czy można jakoś w miarę zgrabnie napisać makro do tego, albo w jakiś sposób niestandardowo eksportować, tak żeby zrozumiała to Mathematica?
bolo
Opisując krótko problem, mam w Excelu dane do wykresu 3D w postaci następującej tabeli:
\(\displaystyle{ \begin{tabular}{l|lllll}
& y_{1} & y_{2} & y_{3} & \ldots & y_{100} \\ \hline
x_{1} & f(x_{1},y_{1}) & f(x_{1},y_{2}) & f(x_{1},y_{3}) & \ldots & f(x_{1},y_{100}) \\
x_{2} & f(x_{2},y_{1}) & f(x_{2},y_{2}) & f(x_{2},y_{3}) & \ldots & f(x_{2},y_{100}) \\
x_{3} & f(x_{3},y_{1}) & f(x_{3},y_{2}) & f(x_{3},y_{3}) & \ldots & f(x_{3},y_{100}) \\
\vdots & \vdots & \vdots & \vdots & & \vdots \\
x_{100} & f(x_{100},y_{1}) & f(x_{100},y_{2}) & f(x_{100},y_{3}) & \ldots & f(x_{100},y_{100}) \\
\end{tabular}}\)
i chciałbym to masowo przekształcić do postaci akceptowanej przez funkcję Plot3D w Mathematica:
\(\displaystyle{ \{x_{1},y_{1},f(x_{1},y_{1})\},\{x_{2},y_{1},f(x_{2},y_{1})\},\{x_{3},y_{1},f(x_{3},y_{1})\},\dots,\\\{x_{1},y_{2},f(x_{1},y_{2})\},\{x_{2},y_{2},f(x_{2},y_{2})\},\{x_{3},y_{2},f(x_{3},y_{2})\},\dots}\)
Czy można jakoś w miarę zgrabnie napisać makro do tego, albo w jakiś sposób niestandardowo eksportować, tak żeby zrozumiała to Mathematica?
bolo
-
- Użytkownik
- Posty: 8601
- Rejestracja: 1 maja 2006, o 20:54
- Płeć: Mężczyzna
- Lokalizacja: Kraków
- Podziękował: 47 razy
- Pomógł: 1816 razy
Wykres 3D, przerobienie danych z Excel do Mathematica
Bardzo możliwe, że nie jest to optymalne rozwiązanie, ale myślę, że się jakoś sprawdzi.
Stwórz w Mathematice listy \(\displaystyle{ x=\{ x_1, \ldots, x_{100} \}}\) i \(\displaystyle{ y = \{ y_1, \ldots, y_{100} \}}\) z wartościami zmiennych. Można to od razu skopiować z Excela lub po drodze skorzystać z jakiegoś edytora tekstu i zamienić , na . czy też spacje na , by Mathematica to zrozumiała.
Następnie kwadrat z danymi podobnie skopiować jako listę do Mathematici, tj.:
\(\displaystyle{ \begin{tabular}{lll}
f(x_1, y_1) & \ldots & f(x_{1}, y_{100} ) \\
\vdots & & \vdots \\
f(x_{100}, y_1) & \ldots & f(x_{100}, y_{100} )
\end{tabular} \rightarrow \{ \{f(x_1, y_1) , \ldots , f(x_{1}, y_{100} ) \} , \ldots , \{ f(x_{100}, y_1) ,\ldots, f(x_{100}, y_{100} ) \} \}}\)
Również edytor tekstu do zamiany znaków końca linii na },{ i spacji na , się przyda.
Mając w Mathematice już te dane (dla przykładu):
Wpisujemy:
I w zmiennej out mamy punkty do wyrysowania w ListPlot3D[].
Stwórz w Mathematice listy \(\displaystyle{ x=\{ x_1, \ldots, x_{100} \}}\) i \(\displaystyle{ y = \{ y_1, \ldots, y_{100} \}}\) z wartościami zmiennych. Można to od razu skopiować z Excela lub po drodze skorzystać z jakiegoś edytora tekstu i zamienić , na . czy też spacje na , by Mathematica to zrozumiała.
Następnie kwadrat z danymi podobnie skopiować jako listę do Mathematici, tj.:
\(\displaystyle{ \begin{tabular}{lll}
f(x_1, y_1) & \ldots & f(x_{1}, y_{100} ) \\
\vdots & & \vdots \\
f(x_{100}, y_1) & \ldots & f(x_{100}, y_{100} )
\end{tabular} \rightarrow \{ \{f(x_1, y_1) , \ldots , f(x_{1}, y_{100} ) \} , \ldots , \{ f(x_{100}, y_1) ,\ldots, f(x_{100}, y_{100} ) \} \}}\)
Również edytor tekstu do zamiany znaków końca linii na },{ i spacji na , się przyda.
Mając w Mathematice już te dane (dla przykładu):
Kod: Zaznacz cały
x = {1, 2, 3, 4}
y = {1, 2, 3, 4}
dane = {{0.3, 0.6, 0.4, 0.2}, {0.6, 0.4, 0.2, 0.1}, {0.1, 0.4, 0.5,
0.6}, {0.3, -0.1, -0.02, 0}}
Kod: Zaznacz cały
out={};For[i=1,i<=Length[x],i++,
For[j=1,j<=Length[y],j++,
AppendTo[out,{x[[i]],y[[j]],dane[[i]][[j]]}]
]
]
Wykres 3D, przerobienie danych z Excel do Mathematica
Makro do Excela, wypisuje to co chcesz w aktywnej komórce wg ustawień wpisanych wewnątrz makra
Kod: Zaznacz cały
Sub TableToMathematica()
Dim Kolumna
Dim Wiersz
Dim IleKolumna
Dim IleWiersz
' Numer kolumny
Kolumna = 1
' Numer Wiersza
Wiersz = 1
' Ile Liczb w Kolumnie
IleKolumna = 2
' Ile liczb w wierszu
IleWiersz = 3
Set wynik = ActiveCell
For Y = Wiersz + 1 To Wiersz + 1 + IleWiersz
For X = Kolumna + 1 To Kolumna + 1 + IleKolumna
wynik.Value = wynik.Value & "{" & Worksheets(1).Cells(X, Wiersz).Value & "," & Worksheets(1).Cells(Kolumna, Y).Value & "," & Worksheets(1).Cells(X, Y).Value & "}" & ", "
Next X
Next Y
End Sub
- bolo
- Użytkownik
- Posty: 2470
- Rejestracja: 2 lis 2004, o 08:28
- Płeć: Mężczyzna
- Lokalizacja: BW
- Podziękował: 8 razy
- Pomógł: 191 razy
Wykres 3D, przerobienie danych z Excel do Mathematica
Poprawiłem na:
i działa elegancko. Można w jakiś prosty sposób dodać do makra wymóg wyrzucenia wyniku od razu do pliku .txt z pominięciem komórki akrusza? Pytam, ponieważ tych trójek jest ok. 450000
Kod: Zaznacz cały
For Y = Wiersz + 1 To Wiersz + 1 + IleWiersz - 1
For X = Kolumna + 1 To Kolumna + 1 + IleKolumna - 1
Wykres 3D, przerobienie danych z Excel do Mathematica
Kod: Zaznacz cały
Sub TableToMathematica()
Dim Kolumna
Dim Wiersz
Dim IleKolumna
Dim IleWiersz
Dim wynik
Dim plik
' Numer kolumny
Kolumna = 1
' Numer Wiersza
Wiersz = 1
' Ile Liczb w Kolumnie
IleKolumna = 2
' Ile liczb w wierszu
IleWiersz = 3
' gdzie zapisac
plik = "C:\wynik.txt"
Set fs = CreateObject("Scripting.FileSystemObject")
Set file = fs.CreateTextFile(plik, True)
For Y = Wiersz + 1 To Wiersz + IleWiersz
For X = Kolumna + 1 To Kolumna + IleKolumna
wynik = wynik & "{" & Worksheets(1).Cells(X, Wiersz).Value & "," & Worksheets(1).Cells(Kolumna, Y).Value & "," & Worksheets(1).Cells(X, Y).Value & "}" & ", "
Next X
Next Y
file.WriteLine (wynik)
file.Close
End Sub
- bolo
- Użytkownik
- Posty: 2470
- Rejestracja: 2 lis 2004, o 08:28
- Płeć: Mężczyzna
- Lokalizacja: BW
- Podziękował: 8 razy
- Pomógł: 191 razy
Wykres 3D, przerobienie danych z Excel do Mathematica
Idealnie, chociaż sprawdziłem też metodę luka52. Mam do przerobienia 2 takie wielkie tabele. Zauważyłem, że już dla 20000 elementów Excel potrafi lekko grymasić. Z kolei SigmaPlot nie pasuje mi i zostaję przy Mathematica, chyba jakiś sentyment...
Pozdrawiam,
bolo
Pozdrawiam,
bolo
Wykres 3D, przerobienie danych z Excel do Mathematica
Piszę bez sprawdzania bo nie mam teraz dostępu do Excela, ale powinno być dobrze
Kod: Zaznacz cały
...
For Y = Wiersz + 1 To Wiersz + IleWiersz
wynik = ""
For X = Kolumna + 1 To Kolumna + IleKolumna
wynik = wynik & "{" & Worksheets(1).Cells(X, Wiersz).Value & "," & Worksheets(1).Cells(Kolumna, Y).Value & "," & Worksheets(1).Cells(X, Y).Value & "}" & ", "
Next X
file.WriteLine (wynik)
Next Y
file.Close
End Sub