Wykres 3D, przerobienie danych z Excel do Mathematica

Mathematica, Matlab, Statistica, LaTeX i wszelkiego rodzaju oprogramowanie przydatne matematykowi w pracy. Miejsca w sieci poświęcone zagadnieniu.
Awatar użytkownika
bolo
Użytkownik
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

Post autor: bolo »

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
luka52
Użytkownik
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

Post autor: luka52 »

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):

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}}
Wpisujemy:

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]]}]
]
]
I w zmiennej out mamy punkty do wyrysowania w ListPlot3D[].
abc666

Wykres 3D, przerobienie danych z Excel do Mathematica

Post autor: abc666 »

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
Awatar użytkownika
bolo
Użytkownik
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

Post autor: bolo »

Poprawiłem na:

Kod: Zaznacz cały

     For Y = Wiersz + 1 To Wiersz + 1 + IleWiersz - 1
        For X = Kolumna + 1 To Kolumna + 1 + IleKolumna - 1
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
abc666

Wykres 3D, przerobienie danych z Excel do Mathematica

Post autor: abc666 »

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
Uwzględniłem też twoją poprawkę
Awatar użytkownika
bolo
Użytkownik
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

Post autor: bolo »

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
abc666

Wykres 3D, przerobienie danych z Excel do Mathematica

Post autor: abc666 »

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
ODPOWIEDZ