Skip to main content
torch.js has not been released yet.
torch.js logotorch.js logotorch.js
PlaygroundContact
Login
Documentation
IntroductionType SafetyTensor ExpressionsTensor IndexingEinsumEinopsAutogradTraining a ModelProfiling & MemoryPyTorch MigrationBest PracticesRuntimesPerformancePyTorch CompatibilityBenchmarksDType Coverage
choleskycholesky_excholesky_inversecholesky_solveCholeskyExOptionsCholeskyInverseOptionsCholeskyOptionsCholeskySolveOptionscondCondOptionscrossCrossOptionsdetdiagonalDiagonalOptionseigeighEighOptionseigvalseigvalshhouseholder_productinvinv_exInvExOptionsldl_factorldl_factor_exldl_solveLdlFactorExOptionsLdlFactorOptionsLdlSolveOptionslobpcgLobpcgOptionslogdetlstsqLstsqOptionslulu_factorlu_factor_exlu_solvelu_unpackLuFactorExOptionsLuFactorOptionsLuOptionsLuSolveOptionsLuUnpackOptionsmatrix_expmatrix_normmatrix_powermatrix_rankMatrixNormOptionsMatrixRankOptionsmulti_dotnormNormOptionspca_lowrankPcaLowrankOptionspinvPinvOptionsqrQrOptionsslogdetsolvesolve_exsolve_triangularSolveExOptionsSolveOptionsSolveTriangularOptionssvdsvd_lowrankSvdLowrankOptionsSvdOptionssvdvalstensorinvTensorinvOptionstensorsolveTensorsolveOptionstracetriangular_solveTriangularSolveOptionsvanderVanderOptionsvecdotVecdotOptionsvector_normVectorNormOptions
absacosacoshAdaptivePool1dShapeAdaptivePool2dShapeaddaddbmmAddbmmOptionsaddcdivAddcdivOptionsaddcmulAddcmulOptionsaddmmAddmmOptionsaddmvAddmvOptionsaddrAddrOptionsadjointallallcloseAllcloseOptionsAlphaBetaOptionsamaxaminaminmaxAminmaxOptionsangleanyapplyOutarangeare_deterministic_algorithms_enabledargmaxargminargsortargwhereas_stridedas_tensorasinasinhAssertNoShapeErrorAssertNotErrorAsStridedOptionsAtat_error_index_out_of_boundsatanatan2atanhatleast_1datleast_2datleast_3dAtShapeautocast_decrement_nestingautocast_increment_nestingautograd_gradient_mismatch_errorautograd_not_registered_errorAutogradConfigAutogradDeviceAutogradDTypeAutogradEntryAutogradHandleAutogradHandleImplAxesRecordBackwardFnbaddbmmBaddbmmOptionsbartlett_windowBaseKernelConfigbatch_dimensions_do_not_match_errorbernoulliBernoulliOptionsBinaryBackwardFnBinaryBroadcastResultBinaryDTypeBinaryKernelConfigCPUBinaryKernelCPUBinaryOpConfigBinaryOpNamesBinaryOpSchemaBinaryOptionsbincountBincountOptionsbitwise_andbitwise_left_shiftbitwise_notbitwise_orbitwise_right_shiftbitwise_xorblackman_windowblock_diagbmmBooleanDTypeRulebroadcast_error_incompatible_dimensionsbroadcast_shapesbroadcast_tensorsbroadcast_toBroadcastShapeBroadcastShapeRulebroadcastShapesbucketizeBucketizeOptionsBufferUsagebuildEinopsErrorbuildErrorMessagecanBroadcastTocartesian_prodcatCatOptionsCatShapeCauchyOptionscdistCdistOptionsceilceluCeluFunctionalOptionschain_matmulCheckShapeErrorCholeskyShapechunkchunk_error_dim_out_of_rangeChunkOptionsclampClampOptionsclear_autocast_cacheclearEinopsCacheclearEinsumCacheclonecolumn_stackcombinationsCombinationsOptionscompiled_with_cxx11_abicomplexconjconj_physicalcontiguousConv1dShapeConv2dShapeConv3dShapeConvTranspose2dShapecopysigncorrcoefcoscoshcount_nonzeroCountNonzeroOptionscovcoverage_reportcoverageReportCoverageReportCovOptionsCPUForwardFnCPUKernelConfigCPUKernelEntryCPUOnlyResultCPUTensorDatacreateCumExtremeResultcreateTorchCreationOpSchemaCumExtremeResultcummaxcummincumprodCumShapecumsumcumulative_trapezoidCumulativeOptionsCumulativeOptionsWithDimdeg2raddetachDeterministicOptionsDetShapeDevicedevice_error_requiresDeviceBufferDeviceCapabilitiesDeviceCheckedResultDeviceConfigDeviceContextDeviceEntryDeviceHandleDeviceInputDeviceOptionsDeviceRegistryDeviceTypediagdiag_embedDiagEmbedOptionsdiagflatDiagflatOptionsDiagFlatOptionsdiagonal_scatterDiagonalOptionsDiagonalScatterOptionsDiagOptionsDiagShapediffDiffOptionsdigammadimension_error_out_of_rangeDispatchConfigdistDistOptionsdivdotDotShapeRuleDoubleDoubleDimdropoutDropoutFunctionalOptionsdsplitdstackDTypedtype_already_registered_errordtype_components_mismatch_errordtype_not_found_errorDTypeComponentsDTypeConfigDTypeCoverageReportDTypeDisplayConfigDTypeEntryDTypeHandleDTypeHandleImplDTypeInfoDTypeRegistryDTypeRuleDTypeSerializationConfigDynamicShapeEigShapeeinops_error_ambiguous_decompositioneinops_error_anonymous_in_outputeinops_error_dimension_mismatcheinops_error_invalid_patterneinops_error_reduce_undefined_outputeinops_error_repeat_missing_sizeeinops_error_undefined_axiseinsumeinsum_error_dimension_mismatcheinsum_error_index_out_of_rangeeinsum_error_invalid_equationeinsum_error_invalid_sublist_elementeinsum_error_operand_count_mismatcheinsum_error_subscript_rank_mismatcheinsum_error_unknown_output_indexEinsumOptionsEinsumOutputShapeEllipsiseluelu_EluFunctionalOptionsembedding_bag_error_requires_2d_inputemptyempty_cacheempty_likeeqequalerferfcerfinvexpexp2expandexpand_asexpand_error_incompatibleExpandShapeexpm1ExponentialOptionseyeEyeOptionsfftFFTOptionsfindKernelWithPredicatefindSimilarPatternsflattenFlattenOptionsFlattenShapeflipflip_error_dim_out_of_rangefliplrFlipShapeflipudfloat_powerFloatDTypeRulefloorfloor_dividefmaxfminfmodformatEquationErrorformatShapefracfrexpfrombufferfullfull_likefunction_already_registered_errorFunctionConfigFunctionEntryFunctionHandlegathergather_error_dim_out_of_rangeGatherShapegcdgegeluGeometricOptionsget_autocast_cpu_dtypeget_autocast_gpu_dtypeget_autocast_ipu_dtypeget_autocast_xla_dtypeget_default_deviceget_default_dtypeget_deterministic_debug_modeget_device_configget_device_contextget_device_moduleget_dtype_infoget_file_pathget_float32_matmul_precisionget_num_interop_threadsget_num_threadsget_op_infoget_printoptionsget_real_dtypeget_rng_stategetAutogradgetDTypegetEinopsCacheSizegetEinsumCacheSizegetFunctiongetKernelgetMethodgetOpInfoGetOpKindGetOpSchemagetScalarKernelgluGluFunctionalOptionsGradContextGradFnGradientsForgtHalfHalfDimhamming_windowhann_windowhardshrinkhardsigmoidhardswishhardtanhhardtanh_HardtanhFunctionalOptionshas_autogradhas_devicehas_dtypehas_kernelhasAutogradhasDTypehasFunctionhasKernelhasMethodhasScalarKernelHasShapeErrorheavisidehistcHistcOptionshistogramHistogramOptionsHistogramResulthsplithstackhypoti0IdentityShapeifftimagindex_addindex_copyindex_fillindex_putindex_reduceindex_selectindex_select_error_dim_out_of_rangeIndexPutOptionsIndexSelectShapeIndexSpecIndicesOptionsIndicesSpecinitialize_deviceInputsForInsertDiminvalid_config_errorinverseInverseShapeirfftis_anomaly_check_nan_enabledis_anomaly_enabledis_autocast_cache_enabledis_autocast_cpu_enabledis_autocast_ipu_enabledis_autocast_xla_enabledis_complexis_complex_dtypeis_cpu_only_modeis_deterministic_algorithms_warn_only_enabledis_floating_pointis_floating_point_dtypeis_inference_mode_enabledis_nonzerois_tensoris_warn_always_enabledis_webgpu_availableIs2DIsAtLeast1DIsBinaryOpIsBinaryOpNameiscloseIscloseOptionsisfiniteisinisinfisnanisneginfisposinfisrealIsReductionOpIsReductionOpNameIsRegistryErrorIsShapeErroristftISTFTOptionsIsUnaryOpIsUnaryOpNameitem_error_not_scalarItemResultkaiser_windowKaiserWindowOptionskernel_not_registered_errorkernel_signature_mismatch_errorKernelConfigKernelConfigWebGPUKernelEntryKernelHandleKernelInfoKernelPredicateKernelRegistryKernelWebGPUkronkthvalueKthvalueOptionslcmldexpleleaky_reluleaky_relu_LeakyReluFunctionalOptionslerplevenshteinDistancelgammalinalg_error_not_square_matrixlinalg_error_requires_2dlinalg_error_requires_at_least_2dlinearlinspacelist_custom_deviceslist_custom_dtypeslist_deviceslist_dtypeslist_functionslist_kernelslist_methodslist_opslistCustomDTypeslistDTypeslistFunctionslistKernelsListKernelsOptionslistMethodslistOpsListOpsOptionsloglog_softmaxlog10log1plog2logaddexplogaddexp2logcumsumexplogical_andlogical_notlogical_orlogical_xorLogitOptionsLogNormalOptionsLogOptionslogsigmoidlogspacelogsumexpLogsumexpOptionsltLUShapeLuSolveOptionsmasked_fillmasked_selectmasked_select_asyncMaskSpecmatmulmatmul_error_inner_dimensions_do_not_matchMatmul2DShapeMatmulShapeMatmulShapeRuleMatrixTransposeShapemaxmaximummeanmedianmemory_statsmemory_summarymeshgridmethod_already_registered_errormethod_dtype_not_supported_errorMethodConfigMethodEntryMethodHandleminminimummishmmMMShapeRulemodemovedimmsortmulmultinomialmultinomial_asyncMultinomialAsyncOptionsMultinomialOptionsMultiplyBymvMVShapeRulenan_to_numnanmeannanmediannanquantileNanReductionOptionsnansumNanToNumOptionsnarrownarrow_copynarrow_error_length_exceeds_boundsnarrow_error_start_out_of_boundsNarrowShapeneneedsBroadcastnegNegativeDimnextafternonzeroNonzeroOptionsnormnormalNormalOptionsNormOptionsnumelonesones_likeop_kind_mismatch_errorop_not_found_errorOpCoverageEntryOpInfoOpKindOpNameOpSchemaOpSchemasouterOuterShapepackPackShapepermutepermute_error_dimension_count_mismatchPermuteShapepoissonpolarPool1dShapePool2dShapePool3dShapepositivepowpreluPrintOptionsprodprofiler_allow_cudagraph_cupti_lazy_reinit_cuda12promote_typesPromoteDTypeRulePutOptionsquantileQuantileOptionsrad2degrandrand_likerandintrandint_likeRandintLikeOptionsRandintOptionsrandnrandn_likeRandomLikeOptionsRandomOptionsrandpermRangeSpecRankravelrealrearrangeRearrangeOptionsRearrangeShapereciprocalreduceReduceOperationReduceOptionsReduceShapeReductionKernelConfigCPUReductionKernelCPUReductionOpNamesReductionOpSchemaReductionOptionsReductionShapeRuleregister_backwardregister_deviceregister_dtyperegister_forwardregister_functionregister_methodregister_scalar_forwardregisterAutogradRegisterBackwardOptionsregisterBinaryOpregisterDTypeRegisterDTypeOptionsRegisteredDTyperegisterFunctionRegisterFunctionOptionsregisterKernelRegisterKernelOptionsregisterMethodRegisterMethodOptionsregisterScalarKernelregisterUnaryOpregistration_failed_errorrelurelu_relu6ReluFunctionalOptionsremainderRemoveDimrepeatrepeat_interleaveRepeatInterleaveOptionsRepeatOptionsRepeatShapeReplaceDimrequireWebGPUreset_peak_memory_statsreshapeReshapeShaperesult_typerfftrollRollOptionsrot90Rot90Optionsroundrrelurrelu_RreluFunctionalOptionsrsqrtSafeExpandShapeSameDTypeRuleSameShapeRuleSaveForBackwardScalarCPUForwardFnScalarCPUKernelConfigScalarKernelEntryScalarKernelHandleScalarWebGPUKernelConfigScaleDimscatterscatter_addscatter_add_scatter_error_dim_out_of_rangescatter_reducescatter_reduce_ScatterReduceOptionsScatterShapesearchsortedSearchSortedOptionsselectselect_error_index_out_of_boundsselect_scatterSelectShapeseluset_default_deviceset_default_tensor_typeset_deterministic_debug_modeset_float32_matmul_precisionset_printoptionsset_warn_alwaysSetupContextFnShapeShapeCheckedResultShapedTensorShapeErrorMessageShapeOpSchemaShapeRulesigmoidsignsignbitsilusinsincsinhSizeOptionsslice_error_out_of_boundsslice_scatterSliceOptionsSliceScatterOptionsSliceShapeSliceSpecsoftmaxsoftmax_error_dim_out_of_rangeSoftmaxShapesoftminSoftminFunctionalOptionssoftplusSoftplusFunctionalOptionssoftshrinksoftsignsortSortOptionssplitsplit_error_dim_out_of_rangeSplitOptionssqrtsquaresqueezeSqueezeOptionsSqueezeShapestackStackOptionsStackShapestdstd_meanStdVarMeanOptionsStdVarOptionsstftSTFTOptionsStrideOptionssubSublistSublistElementSubscriptIndexsumSVDShapeswapaxessym_floatsym_intsym_notttaketake_along_dimTakeAlongDimOptionstantanhtanhshrinktensortensor_splitTensorCreatorTensorDatatensordotTensordotOptionsTensorLikeTensorMetaTensorOptionsTensorStoragethresholdthreshold_tileTileShapeToOptionstopkTopkOptionsTorchtraceTraceShapetransposetranspose_dims_error_out_of_rangetranspose_error_requires_2d_tensorTransposeDimsShapeTransposeDimsShapeCheckedTransposeShapetrapezoidTrapezoidOptionsTriangularOptionstriltril_indicesTriOptionsTripletriutriu_indicestrue_dividetruncTupleOfLengthTypedArrayTypedArrayForTypedStorageTypeOptionsUnaryBackwardFnUnaryDTypeUnaryKernelConfigCPUUnaryKernelCPUUnaryOpConfigUnaryOpFnUnaryOpNamesUnaryOpParamsUnaryOpSchemaUnaryOptionsunbindunbind_error_dim_out_of_rangeUnbindOptionsunflattenUniformOptionsuniqueunique_consecutiveUniqueConsecutiveOptionsUniqueOptionsunpackUnpackShapeunravel_indexunregister_deviceunsqueezeUnsqueezeOptionsUnsqueezeShapeuse_deterministic_algorithmsValidateBatchedSquareMatrixValidateChunkDimValidatedEinsumShapevalidateDeviceValidateDeviceValidatedRearrangeShapeValidatedReduceShapeValidatedRepeatShapevalidateDTypeValidateEinsumValidateOperandCountValidateRanksValidateScalarValidateSplitDimValidateSquareMatrixValidateUnbindDimValueOptionsvar_var_meanvdotviewview_as_complexview_as_realvmapvsplitvstackWebGPUKernelConfigWebGPUOnlyResultWebGPUTensorDatawhereWindowOptionsxlogyzeroszeros_like
torch.js· 2026
LegalTerms of UsePrivacy Policy
/
/
  1. docs
  2. torch.js
  3. torch
  4. linalg
  5. solve_triangular

torch.linalg.solve_triangular

function solve_triangular<S extends Shape, D extends DType, Dev extends DeviceType>(A: Tensor<S, D, Dev>, B: Tensor<Shape, D, Dev>, options: SolveTriangularOptions): Tensor<DynamicShape, D, Dev>function solve_triangular<S extends Shape, D extends DType, Dev extends DeviceType>(A: Tensor<S, D, Dev>, B: Tensor<Shape, D, Dev>, upper: boolean, left: boolean, unitriangular: boolean, options?: SolveTriangularOptions): Tensor<DynamicShape, D, Dev>

Solves the matrix equation AX = B where A is triangular.

Highly efficient O(n²) solver for triangular systems via forward/backward substitution. Critical for:

  • Completing LU-based solvers (solve LY = B, then UX = Y)
  • Solving in QR-based least squares (solve R X = Q^T B)
  • Direct solution when matrix structure is known
  • Cholesky-based solvers (solve LL^T X = B)

Much faster than general solvers (O(n²) vs O(n³)) since A's triangular structure is exploited by forward/backward substitution instead of Gaussian elimination.

Handles both forward substitution (lower triangular) and backward substitution (upper triangular).

AX=B solved via forward substitution (if A lower) or backward substitution (if upper)Forward substitution: xi=(bi−sumj=1i−1aijxj)/aiiBackward substitution: xi=(bi−sumj=i+1naijxj)/aii\begin{aligned} AX = B \text{ solved via forward substitution (if } A \text{ lower) or backward substitution (if upper)} \\ \text{Forward substitution: } x_i = (b_i - \\sum_{j=1}^{i-1} a_{ij} x_j) / a_{ii} \\ \text{Backward substitution: } x_i = (b_i - \\sum_{j=i+1}^{n} a_{ij} x_j) / a_{ii} \end{aligned}AX=B solved via forward substitution (if A lower) or backward substitution (if upper)Forward substitution: xi​=(bi​−sumj=1i−1​aij​xj​)/aii​Backward substitution: xi​=(bi​−sumj=i+1n​aij​xj​)/aii​​
  • Forward substitution: For lower triangular, solves one unknown per row (top to bottom)
  • Backward substitution: For upper triangular, solves one unknown per row (bottom to top)
  • Unit diagonal: Setting unitriangular=true skips division (faster if diagonal is all 1s)
  • Efficiency: O(n²) - much faster than general solvers O(n³)
  • Multiple RHS: Can solve many RHS simultaneously (columns of B)
  • GPU accelerated: Efficient parallel implementation on GPU
  • Numerical stability: Stable forward/backward substitution; ill-conditioning depends on matrix condition number
  • Triangular structure required: A must actually be triangular; results undefined if not
  • No pivoting: Unlike general solvers, no row exchanges for stability; matrix should be well-scaled
  • Diagonal zeros: If diagonal has zeros and unitriangular=false, division by zero occurs

Parameters

ATensor<S, D, Dev>
Triangular coefficient matrix (n × n) or batch (..., n, n)
BTensor<Shape, D, Dev>
Right-hand side matrix or vector, shape (..., n) or (..., n, k)
optionsSolveTriangularOptions
Solution options: - upper: Whether A is upper triangular (true) or lower triangular (false) - left: Solve AX = B (true, default) vs XA = B (false, not yet implemented) - unitriangular: Whether A has unit diagonal = 1 (default: false)

Returns

Tensor<DynamicShape, D, Dev>– Solution matrix X with same shape as B

Examples

// Solve upper triangular system
const A = torch.tensor([[2.0, 1.0], [0.0, 3.0]]);  // Upper triangular
const B = torch.tensor([[7.0], [9.0]]);
const X = torch.linalg.solve_triangular(A, B, { upper: true });
// X ≈ [[2], [3]]

// Solve lower triangular system
const L = torch.tensor([[2.0, 0.0], [1.0, 3.0]]);  // Lower triangular
const B = torch.tensor([[4.0], [15.0]]);
const Y = torch.linalg.solve_triangular(L, B, { upper: false });
// Y ≈ [[2], [4.33...]]

// Matrix equation (multiple RHS)
const U = torch.randn(5, 5).triu();  // Random upper triangular
const B = torch.randn(5, 3);          // 3 RHS
const X = torch.linalg.solve_triangular(U, B, { upper: true });
// X: [5, 3] - each column solves UX[:,i] = B[:,i]

// Unit diagonal (faster, no division needed on diagonal)
const L_unit = torch.randn(4, 4).tril();  // Lower with implicit 1s on diagonal
const B = torch.randn(4);
const X = torch.linalg.solve_triangular(L_unit, B, { upper: false, unitriangular: true });

// Solving after LU decomposition
const A = torch.randn(10, 10);
const b = torch.randn(10);
const [LU, pivots] = torch.linalg.lu_factor(A);
const L = LU.tril(-1).add(torch.eye(10));
const U = LU.triu();
const y = torch.linalg.solve_triangular(L, b, { upper: false, unitriangular: true });
const x = torch.linalg.solve_triangular(U, y, { upper: true });
// x is solution to Ax = b

See Also

  • PyTorch torch.linalg.solve_triangular()
  • solve - General linear solver (handles non-triangular matrices)
  • lu_factor - LU decomposition (produces triangular L and U)
  • cholesky - Cholesky decomposition (produces triangular L for positive-definite)
  • qr - QR decomposition (produces triangular R)
Previous
solve_ex
Next
SolveExOptions