11

MS-Excel (v2007 と v2003 の両方) で対称行列を扱うことがあります。

下の三角形から上の三角形に式をコピーするのに役立つオプションはありますか?

コピーと貼り付け/トランスポンスのようなものである必要がありますが、これらの機能は通常、長方形の領域でのみ機能します。

追加された図では、行列の上三角形の対称値をリンクすることによって複製する必要がある式の例を見ることができます。 対称式行列

4

9 に答える 9

3

上記の回答の 1 つが示すように、これは Excel の数式を使用して行うことができます。しかし、これは非常に面倒な手順だと思います。特にこれが定期的に行う必要がある場合。その場合、VBA を使用すると時間を大幅に節約できます。

次のコードは、正方形の選択で機能し、事前に入力されているのがマトリックスの下部または上部であるかどうかに関係なく、マトリックスの残りの部分を塗りつぶします。

Option Explicit

Sub FillSymetricMatrix()
    Dim i As Integer, j As Integer
    Dim SelRng As Range
    Dim FillArea As String
    Dim FRow As Integer
    Dim FCol As Integer

    Set SelRng = Selection
    FRow = SelRng.Rows(1).Row
    FCol = SelRng.Columns(1).Column

    'Returns information about which area to fill
    If ActiveSheet.Cells(FRow + SelRng.Rows.Count - 1, FCol).Value <> vbNullString Then       'Lower filled
        If ActiveSheet.Cells(FRow, FCol + SelRng.Columns.Count - 1).Value = vbNullString Then 'Upper empty
            FillArea = "Upper"
        Else
            FillArea = "Error"
        End If
    Else
        If ActiveSheet.Cells(FRow, FCol + SelRng.Columns.Count - 1).Value <> vbNullString Then 'Upper filled
            FillArea = "Lower"
        Else
            FillArea = "Error"
        End If

    End If

    'Determines if the selection is square
    If SelRng.Rows.Count <> SelRng.Columns.Count Then FillArea = "Error"


    'Fills empty area of the square (symetric) matrix
    Select Case FillArea
        Case Is = "Upper"
            For i = 0 To SelRng.Rows.Count - 1 Step 1
                For j = 0 To SelRng.Columns.Count - 1 Step 1
                    If i <= j Then ActiveSheet.Cells(i + FRow, j + FCol).Value = ActiveSheet.Cells(j + FRow, i + FCol).Value
                Next j
            Next i

        Case Is = "Lower"
            For i = 0 To SelRng.Rows.Count - 1 Step 1
                For j = 0 To SelRng.Columns.Count - 1 Step 1
                    If i <= j Then ActiveSheet.Cells(j + FRow, i + FCol).Value = ActiveSheet.Cells(i + FRow, j + FCol).Value
                Next j
            Next i

        Case Else
            MsgBox "The procedure cannot be performed on the current selection!"
    End Select
End Sub
于 2013-10-14T15:29:15.997 に答える
2

X(j,k)必要なのは、正方行列の「対角」値を返す関数だと思います。X(k,j)

これを試して:

Function DIAGONAL(Arg As Range, Reference As Range) As Variant
Dim MyRow As Long, MyCol As Long

    If Reference.Rows.Count <> Reference.Columns.Count Then
        DIAGONAL = CVErr(xlErrRef)
    Else
        MyRow = Arg.Row - Reference.Row + 1
        MyCol = Arg.Column - Reference.Column + 1
        If MyRow < 1 Or MyCol < 1 Or MyRow > Reference.Rows.Count Or MyCol > Reference.Columns.Count Then
            DIAGONAL = CVErr(xlErrNA)
        Else
            DIAGONAL = Reference(MyCol, MyRow)
        End If
    End If

End Function

この関数を VBA に入力すると、正方行列の内部または外部で使用できます...引数 (パラメーター: Arg) が行列 (パラメーター: 参照) 内にあることを確認する必要があります。 #N/A エラー。または、行列が正方でない場合、#REF エラーが発生します。

したがって、あなたの例では、B4: に入り、=10-DIAGONAL(B4,$B$2:$K$11)これを下の三角形全体にコピーします。

完全な行列を転置することもできます...スクリーンショットで、セル B13 に移動し、=DIAGONAL(B2,$B$2:$K$11)下と右に 9x を入力してコピーします

ボタンなし、Sub を明示的に開始する必要なし ... 任意のサイズの nxn 行列、文字列と数値の処理 ...

于 2013-10-14T16:04:02.207 に答える
1

VBAでの例です。空のテーブルとボタンから始めます。

スクリーン1

次に、ボタンでコードを実行します。

Option Explicit

Private Sub symmButton_Click()
    MakeSymmetric Range("B2")
End Sub

Public Sub MakeSymmetric(ByRef r As Range)

    Dim M As Long
    M = CountCols(r)

    Dim vals() As Variant
    vals = r.Resize(M, M).Value2

    Dim i As Long, j As Long
    For i = 2 To M
        For j = 1 To i - 1
            vals(i, j) = vals(j, i)
        Next j
    Next i

    r.Resize(M, M).Value2 = vals
End Sub


Public Function CountCols(ByRef r As Range) As Long
    If IsEmpty(r) Then
        CountCols = 0
    ElseIf IsEmpty(r.Offset(0, 1)) Then
        CountCols = 1
    Else
        CountCols = r.Worksheet.Range(r, r.End(xlToRight)).Columns.Count
    End If
End Function

そして最後に結果を観察します

ここに画像の説明を入力

于 2013-10-14T14:12:09.580 に答える
1

ショーンのソリューションと同様に、数式も使用します。転置された値を取得するには、次の式を使用します。

=INDEX($B$2:$G$7,COLUMN()-COLUMN($B$2)+1,ROW()-ROW($B$2)+1)

より複雑な操作 (例: ) を実行する場合は、名前付き範囲を使用することをお勧めします。名前マネージャーなどで=10-[transposedValue]新しい名前を挿入します。TransposedValueセル リンクの代わりに、上記の式を指定します。これで、マトリックスに次の式を文字通り書くことができます。

=10-TransposedValue
于 2013-10-30T15:20:40.990 に答える
0

私はこの方法を持っています。あなたが言ったように、コピーペーストの転置は長方形の範囲で機能します。そして、あなたの問題は、三角形の範囲があることです。

あなたはこれを気に入るはずです....

1)。上三角行列を含む正方形の範囲を選択し、コピーします。

2)。空の場所でセルを選択し、次の 2 つの手順を実行します。

  • a.) 形式を選択して貼り付け - 値
  • b.) 形式を選択して貼り付け - 値 - 転置 - 空白をスキップ

そして、対称行列を取得しました:-)

アニル。

于 2015-02-24T14:08:25.247 に答える